代码块详解

简介: 代码块详解

1.基本介绍

在这里插入图片描述
基本语法
在这里插入图片描述
代码块的好处
1.相当于另外一种形式的构造器((对构造器的补充机制),可以用来做初始化的操作
2.场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性

package codeblock;


public class code1 {
    public static void main(String[] args) {
        new Movie();
        System.out.println("----------------------");
        new Movie("tom");
        System.out.println("----------------------");
        new Movie("jack","jim");
        System.out.println("----------------------");
        new Movie("jacky","tim",20);
    }
}

class Movie{
    private String name;
    private String director;
    private double price;

    {
        System.out.println("电影开始");
        System.out.println("准备观看");
    }
    public Movie() {
        System.out.println("无参构造器被调用");
    }

    public Movie(String name) {
        System.out.println("Movie(String name)被调用");
        this.name = name;
    }

    public Movie(String name, String director) {
        System.out.println("Movie(String name,String director)被调用");
        this.name = name;
        this.director = director;
    }

    public Movie(String name, String director, double price) {
        System.out.println("Movie(String name,String director,double price)被调用");
        this.name = name;
        this.director = director;
        this.price = price;
    }
}


执行结果
在这里插入图片描述

如果构造器当中有相同的语句,我们可以把这些语句放在代码块中,不然会显得代码冗余
这样子不管我们调用哪一个构造器,创建对象,都会先调用代码块的内容
代码块调用顺序优先于构造器

2.代码块使用的注意事项

代码块先执行,构造器再执行
在这里插入图片描述

package  codeblock;

 
public class code2 {
    public static void main(String[] args) {
        new A();
    }
}
class A{
    static {
        System.out.println("静态代码块A执行");
    }
    {
        System.out.println("代码块A执行");
    }
    public A(){
        System.out.println("构造器A执行");
    }

}

执行结果:

静态代码块A执行
代码块A执行
构造器A执行
package com.zyh.codeblock;

/**
 * @author zengyihong
 * @create 2022--02--20 9:22
 */
public class code2 {
    public static void main(String[] args) {
        //new A();
        new B();
    }
}
class A{
    static {
        System.out.println("静态代码块A执行");
    }
    {
        System.out.println("代码块A执行");
    }
    public A(){
        System.out.println("构造器A执行");
    }

}

class B extends A{

    static {
        System.out.println("静态代码块B执行");
    }
    {
        System.out.println("代码块B执行");
    }


}

执行结果:
在这里插入图片描述
静态代码块随着类的加载而加载,并且只会加载一次,代码块随着对象的创建,每创建一次,都会调用一次

package  codeblock;

 
public class code2 {
    public static void main(String[] args) {
        //new A();
        new B();
        System.out.println("-------------------");
        new B();
    }
}
class A{
    static {
        System.out.println("静态代码块A执行");
    }
    {
        System.out.println("代码块A执行");
    }
    public A(){
        System.out.println("构造器A执行");
    }

}

class B extends A{

    static {
        System.out.println("静态代码块B执行");
    }
    {
        System.out.println("代码块B执行");
    }


}

在这里插入图片描述
在这里插入图片描述

package codeblock;

public class code3 {
  public static void main(String[] args) {

    D d = new D();// (1) A 静态代码块 01 (2) getN1 被调用...(3)A 普通代码块 01(4)getN2 被调用...(5)A()  构造器被调

  }
}

class D {
   //普通代码块

 {
  System.out.println("A 普通代码块 01");
 }

 private int n2 = getN2();//普通属性的初始化


 private static    int n1 = getN1();
 static { //静态代码块
  System.out.println("D 静态代码块 01");
 }

 //静态属性的初始化

 public static int getN1() {
  System.out.println("getN1 被调用...");
  return 100;
 }

 public int getN2() { //普通方法/非静态方法
  System.out.println("getN2 被调用...");
  return 200;
 }
 //无参构造器
 public D() {
  System.out.println("A()  构造器被调用");
 }
}

在这里插入图片描述
在这里插入图片描述

package codeblock;

public class CodeBlockDetail03 {
    public static void main(String[] args) {
        //(1)AAA 的普通代码块(2)AAA()  构造器被调用(3)BBB 的普通代码块(4)BBB()  构造器被调用 }
        new BBB();
    }
}
    class AAA { //父类 Object
        {
            System.out.println("AAA 的普通代码块");
        }

        public AAA() {
//(1)super()
//(2)调用本类的普通代码块
            System.out.println("AAA()  构造器被调用....");
        }


    }

   class BBB extends AAA {
        {
            System.out.println("BBB 的普通代码块...");
        }

        public BBB() {
//(1)super()
//(2)调用本类的普通代码块
            System.out.println("BBB()  构造器被调用....");
        }
    }

在这里插入图片描述
在这里插入图片描述

静态代码块只能调用静态属性,静态方法,而普通代码块可以调用任何成员

注:本文是学习韩顺平老师的课程所写

相关文章
|
1月前
|
搜索推荐
在 catch 代码块中处理多个异常类型
【10月更文挑战第12天】 在 catch 代码块中处理多个异常类型
51 2
|
5月前
|
Java 编译器
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
Java中4种代码块:普通代码块,静态代码块,同步代码块,构造代码块
234 0
实例详解局部代码块,构造代码块,静态代码块
实例详解局部代码块,构造代码块,静态代码块
|
6月前
|
存储 Java 容器
深入Java核心:变量、循环与条件语句的魔法
深入Java核心:变量、循环与条件语句的魔法
46 0
|
6月前
|
Java
Synchronized实现原理(方法代码块)
Synchronized实现原理(方法代码块)
62 0
|
11月前
|
C# 数据库
C# 四种循环体的使用与区别
C# 四种循环体的使用与区别
|
Java
类成员(代码块)
类成员(代码块)
57 1
|
存储 C# C++
VS中的代码块的使用
VS中的代码块的使用
VS中的代码块的使用
|
Java 编译器
复习篇【类的构造方法与代码块的执行】
复习篇【类的构造方法与代码块的执行】
复习篇【类的构造方法与代码块的执行】