构造函数,构造代码块

构造函数
  • 构造函数的作用
调用
public static void main(String[] args) {
        new Demo("Test",18);
}

class Demo{

    public String name;
    public int age;

    public Demo(){
        构造函数没有返回值
        方法名与类名相同
    }

    对类对象进行初始化,允许以重载的形式存在多个构造函数
    public Demo(String name,int age){
        this.name = name;
        this.age = age;
        System.out.println(this.name+"\r\n"+this.age);
    }
}
  • 如果一个类没有显式的声明构造函数,Java编译器在编译时会自动添加一个无参的构造函数,当显式声明了构造函数,将不会自动添加。

  • 为什么一定要有这个构造函数?
    因为成员变量的初始化都是通过调用构造函数完成(类加载的准备阶段)。

  • 添加的构造函数,其权限修饰符与类的权限修饰符是一致的。
    如果当前类的权限修饰符为private class,那么这个构造方法的权限修饰符就是private,同理,如果是public class,构造方法的权限修饰符即为public。

构造代码块
  • 构造代码块的作用
class Demo{

    public String name;
    public int age;
    public static int count;

    
     其实构造代码块中的代码也是在构造函数中执行。
     .class文件经过Java编译器编译后,构造代码块中的代码会被移动到构造函数中,
     放置在构造函数中代码的最前端,
     
    {
        this.name = "Test";
        this.age = 18;
        System.out.println("只执行一次" + count);
    }

    静态代码块是在.class文件加载到内存时就马上执行,不需要等到创建对象
    由于类只加载一次,因此静态代码块只执行一次。
    static{
        count++;
        System.out.println("只执行一次" + count);
    }

    public void test(){
        {
            //局部代码块:缩短局部变量的生命周期,节省一点点内存,其实没什么作用
            System.out.println(name+"\r\n"+age);
        }
    }
}
  • 补充
class Demo {
    {
        i = 18;
    }
    Java编译器在编译时,会把成员变量的声明语句提前至一个类的最前端。
    注意,提到最前端的只是声明(private int i),实际的赋值还是按调用顺序。
    public int i = 19;

    public void test() {
        System.out.println(i + "输出19");
    }
}

你可能感兴趣的:(构造函数,构造代码块)