Java基础 —— 初始化 (一)

121 阅读2分钟

构造器

Java同C++一样采用构造器(也称构造函数)来确保类的每个对象都会得到初始化。在创建对象的时候,如果类中存在构造器。则Java编译器会在操作对象之前自动调用对应的构造器,来确保初始化可以正常进行。构造器的名字与类名相同,因此构造器不受到“每个方法首字母小写”的编码风格的约束。构造器可以有参数也可以无参数。当一个类中只有一个构造器时,则无法使用除了这个构造器的其他方式创建新的对象。如果需要用多种方式去创建新的对象,需要把构造器重载。当类中没有写构造器的时候,编译器会创建一个默认构造器。默认构造器是没有参数的构造器,是用来创建一个“默认对象”的。

class HelloWorld{
    HelloWorld(){
        System.out.println("创建一个HelloWorld对象");
    }
    HelloWorld(String str){
        System.out.println("创建一个参数为:" + str + "的HelloWorld对象");
    }
}

public class Learn{
    public static void main(String[] args){
        HelloWorld helloWorld = new HelloWorld();
        HelloWorld helloWorld = new HelloWorld("New World");
    }
} 
class HelloWorld{}

public class Learn{
    public static void main(String[] args){
        HelloWorld helloWorld = new HelloWorld(); //会创建默认的HelloWorld构造器
    }
} 

初始化的顺序

普通的Java类中内容的初始化顺序

  • 静态变量
  • 静态代码块
  • 普通变量
  • 普通代码块
  • 构造函数
public class HelloWorld{
    public static String staticStr = "静态变量";
    
    public String str = "普通变量";
    
    static {
        System.out.println("静态代码块");
    }
    
    {
        System.out.println("普通代码块");
    }
    
    HelloWorld(){
        System.out.println("构造函数");
    }
    
    public static void main(String[] args){
        new HelloWorld();
    }
}

输出信息为

静态代码块
普通代码块
构造函数

Java子类中内容的初始化顺序

  • 父类静态变量
  • 父类静态代码块
  • 子类静态变量
  • 子类静态代码块
  • 父类普通变量
  • 父类普通代码块
  • 父类构造函数
  • 子类普通变量
  • 子类普通代码块
  • 子类构造函数
public class Father{
    public static String staticStr = "父类静态变量";
    
    public String str = "父类普通变量";
    
    static {
        System.out.println("父类静态代码块");
    }
    
    {
        System.out.println("父类普通代码块");
    }
    
    HelloWorld(){
        System.out.println("父类构造函数");
    }
}

public class Child extends Father{
    public static String staticStr = "子类静态变量";
    
    public String str = "子类普通变量";
    
    static {
        System.out.println("子类静态代码块");
    }
    
    {
        System.out.println("子类普通代码块");
    }
    
    HelloWorld(){
        System.out.println("子类构造函数");
    }
    
    public static void main(String[] args){
        new Child();
    }
}

输出信息为

父类静态代码块
子类静态代码块
父类普通代码块
父类构造函数
子类普通代码块
子类构造函数