* c:不要为了部分功能而去继承
this和super都代表什么 * this:代表当前对象的引用,谁来调用我,我就代表谁 * super:代表当前对象父类的引用this和super的使用区别 * a:调用成员变量 * this.成员变量 调用本类的成员变量,也可以调用父类的成员变量 * super.成员变量 调用父类的成员变量 * b:调用构造方法 * this(...)调用本类的构造方法 * super(...)调用父类的构造方法 * c:调用成员方法 * this.成员方法 调用本类的成员方法,也可以调用父类的方法 * super.成员方法 调用父类的成员方法子类中所有的构造方法默认都会访问父类中空参数的构造方法 为什么呢? * 因为子类会继承父类中的数据,可能还会使用父类的数据。 * 所以,子类初始化之前,一定要先完成父类数据的初始化。 * 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。
class Extends{ public static void main(String[] args){ Son s = new Son(); s.setName("李四"); System.out.PRintln("--------------------------"); Zi z = new Zi(); /* 1、jvm调用了main方法,main进栈 2、遇到Zi z = new Zi();会先将Fu.class和Zi.class分别加载进内存,在创建对象, 当Fu.class加载进内存,父类的静态代码块会随着Fu.class一起加载,当Zi.class加载 进内存,子类的静态代码块会随着Zi.class一起加载第一个输出,静态代码块Fu,第二个 输出静态代码块Zi 3、走Zi类的构造方法,因为Java中分层初始化的,先初始化父类,在初始化子类,所以先走 的父类,但是执行父类构造时,发现父类有构造代码块,构造代码块是优先于构造方法执行的, 所以第三个输出构造代码块Fu,第四个输出构造方法Fu 4、Fu类初始化结束,子类初始化,第五个输出构造代码块Zi,构造方法Zi */ }}class Father{ private String name; private int age; public Father(){ System.out.println("Father 空参构造方法"); } public Father(String name,int age){ System.out.println("Fathe 有参构造方法"); } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; }}class Son extends Father{ public Son(){ super(); //系统默认加上,用来访问父类中的空参构造 System.out.println("Son 空参构造方法"); } public Son(String name,int age){ System.out.println("Son 有参构造方法"); }}class Fu { static { System.out.println("静态代码块Fu"); } { System.out.println("构造代码块Fu"); } public Fu() { System.out.println("构造方法Fu"); }} class Zi extends Fu { static { System.out.println("静态代码块Zi"); } { System.out.println("构造代码块Zi"); } public Zi() { System.out.println("构造方法Zi"); }}
新闻热点
疑难解答