本文为学习笔记,留作自用,不会记载的特别详细,如有错误,欢迎指正
一、this与super
this与super都指向对象,区别在于this指向当前对象,super指向父类对象
二、static与类、对象的初始化
static为静态标识,被static标记的成员变量、方法将会被在类被加载时初始化且只加载一次,并从属于类而非对象
this可以调用静态成员变量,反过来则不行,因为static变量在类加载时初始化,此时不一定存在对象。
我们知道子类在初始化时,会先调用父类的构造方法,我们结合static来一起看下
public class PorblemSolution { static{ System.out.println("static 1"); } static{ System.out.println("static 2"); } public static void main(String[] args){ Son s = new Son(); } } class GrandFather{ Person person = new Person("GrandFather"); static{ System.out.println("GrandFather static"); } public GrandFather(){ System.out.println("GrandFather 构造函数"); } } class Father extends GrandFather{ Person person = new Person("Father"); static{ System.out.println("Father static"); } public Father(){ System.out.println("Father 构造函数"); } } class Son extends Father{ Person person = new Person("Son"); static{ System.out.println("Son static"); } public Son(){ System.out.println("Son 构造函数"); } } class Person{ static{ System.out.println("person static"); } public Person(String str) { System.out.println("person "+str); } }
执行结果如下:
首先加载PorblemSolution类,按顺序执行2个静态初始化块,然后实例化Son对象,实例化前,会先
加载父类GrandFather与Father,依次执行父类的静态初始化块,子类的静态初始化块,再然后初始化父类成员变量,执行父类构造方法,初始化子类成员变量,
执行子类构造方法。