一、类初始化过程
- 一个类要创建实例需要先加载并初始化该类,main方法运行时会先加载或初始化当前main方法所在的类
- 一个子类要初始化需要先初始化父类
- 一个类要初始化就是先执行<clinit>()方法:
- <clinit>()方法由静态类变量显示赋值代码和静态代码块组成
- 类变量显示赋值代码和静态代码块代码,从上到下顺序执行
- <clinit>()方法只执行一次
二、实例初始化过程
子类的实例化方法:
实例初始化就是执行<init>()方法
- <init>()方法可能重载有多个,有几个构造器就有几个<init>()方法
- <init>()方法由非静态实例变量显示赋值代码和非静态代码块,对应构造器代码组成
- 非静态实例变量显示赋值代码和非静态代码块代码从上到下顺序执行,而对应构造器的代码最后执行
- 每次创建实例对象,调用对应的构造器,执行的就是对应的<init>方法
- <init>()方法的首行是super()或super(实参列表),即对应父类的<init>方法。
哪些方法不可以被重写:
- final方法
- 静态方法
- private等子类中不可见方法
对象的多态性
- 子类如果重写了父类的方法,通过子类对象调用的一定是子类重写过的代码
- 非静态方法默认的调用对象是this
- this对象在构造器或者说<init>方法中就是正在创建的对象
方法的override和overload的区别
重写(override):外壳不变,核心重写
注:重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,只能抛出 IOException 的子类异常

重载(overload)
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
重载规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准

类初始化深入浅出
原文:https://www.cnblogs.com/chai-blogs/p/12615792.html