Java创建对象时初始化顺序

Java创建对象时初始化顺序

类初始化过程

  1. 一个类创建实例首先需要加载并初始化该类
    • main方法所在的类需要先加载和初始化
  2. 一个子类要初始化需要先初始化其父类
  3. 一个类的初始化就是执行<clinit>() 方法(类初始化方法)
    • <clinit>() 方法由静态类变量显示赋值代码和静态代码块组成
    • <clinit>() 的执行顺序按照书写的顺序执行
    • <clinit>() 只执行一次

实例初始化过程

  1. 实例初始化就是执行<init>() 方法
    • <init>() 方法可能重载很多个,有几个构造器就有几个<init>() 方法
    • <init>() 方法由非静态实例变量显示赋值代码和非静态代码块,对应的构造器代码组成
    • 非静态实例变量显示赋值代码和非静态代码块按照书写顺序执行,构造器方法最后执行
    • 每次创建实例对象,调用对应的构造器,执行的都是对应的<init>() 方法
    • <init>() 方法的首行是super()或super(实参列表),即先执行父类的<init>方法,super() 可以省略,子类的构造器中一定会有super()方法,使用的时候需要注意。

方法的重写(Override)

哪些方法不能被重写

  1. final 修饰的方法
  2. 静态方法
  3. private等子类中不可见的方法
  4. 构造方法不能被重写
  5. 不能被继承的方法,不能被重写

对象的多态性

  1. 子类如果重写了父类的方法, 通过子类调用的方法,一定是重写后的方法
  2. 非静态方法默认的调用对象是this
  3. this对象在构造器或者说<init>方法中就是正在创建的对象

重写的要求

  1. 方法名及参数列表必须完全与被重写方法的相同
  2. 返回类型与被重写方法的返回类型可以不相同,子类返回值[层次] <= 父类返回值[层次]
  3. 子类访问权限 >= 父类中被重写的方法的访问权限
    1. 例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
  4. 父类的成员方法只能被它的子类重写。
  5. 重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

重写(Override)和重载(Overload)的区别

重载的要求

  1. 方法签名必须相同
  2. 被重载的方法必须改变参数列表(参数个数或类型不一样);
  3. 返回类型可以不同
  4. 访问修饰符可以不同
  5. 可以声明新的或更广的检查异常;
  6. main 方法也可以被重载

示例

public class Father {
    private int i = test();
    private static int j = method();
    static {
        System.out.print("(1)");
    }
    Father(){
        System.out.print("(2)");
    }
    {
        System.out.print("(3)");
    }

    public int test(){
        System.out.print("(4)");
        return 1;
    }
    public static int method(){
        System.out.print("(5)");
        return 1;
    }
}

/**********************************/
public class Son extends Father{
    private int i = test();
    private static int j = method();
    static {
        System.out.print("(6)");
    }
    Son(){
        System.out.print("(7)");
    }
    {
        System.out.print("(8)");
    }

    public int test(){
        System.out.print("(9)");
        return 1;
    }
    public static int method(){
        System.out.print("(10)");
        return 1;
    }

    public static void main(String[] args) {
        Son s1 = new Son();
        System.out.println();
        Son s2 = new Son();
    }
}

/****************** 执行结果 ********************/
(5)(1)(10)(6)(9)(3)(2)(9)(8)(7)
(9)(3)(2)(9)(8)(7)
发布了21 篇原创文章 · 获赞 5 · 访问量 2069

猜你喜欢

转载自blog.csdn.net/fan521dan/article/details/95669891