this和super
this和super的区别?
分别是什么呢?
this代表本类对应的引用。
super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
怎么用呢?
A:调用成员变量
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
B:调用构造方法
this(...) 调用本类的构造方法
super(...) 调用父类的构造方法
C:调用成员方法
this.成员方法 调用本类的成员方法(静态方法不能用this调用)
super.成员方法 调用父类的成员方法
class Father { public int num = 10; } class Son extends Father { public int num = 20; public void show() { int num = 30; System.out.println(num); System.out.println(this.num); System.out.println(super.num); } } class ExtendsDemo5 { public static void main(String[] args) { Son s = new Son(); s.show(); } }
继承中构造方法的关系
A:子类中所有的构造方法默认都会访问父类中空参数的构造方法
B:为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据。
所以,子类初始化之前,一定要先完成父类数据的初始化。
注意:子类每一个构造方法的第一条语句默认都是:super();
class Father { int age; public Father() { System.out.println("Father的无参构造方法"); } public Father(String name) { System.out.println("Father的带参构造方法"); } } class Son extends Father { public Son() { //super(); System.out.println("Son的无参构造方法"); } public Son(String name) { //super(); System.out.println("Son的带参构造方法"); } } class ExtendsDemo6 { public static void main(String[] args) { //创建对象 Son s = new Son(); System.out.println("------------"); Son s2 = new Son("jeck"); } }
如果父类没有无参构造方法,那么子类的构造方法会出现什么现象呢?
报错。
如何解决呢?
A:在父类中加一个无参构造方法
B:通过使用super关键字去显示的调用父类的带参构造方法
C:子类通过this去调用本类的其他构造方法
子类中一定要有一个去访问了父类的构造方法,否则父类数据就没有初始化。
注意事项:
this(...)或者super(...)必须出现在第一条语句上。
如果不是放在第一条语句上,就可能对父类的数据进行了多次初始化。
class Father { /* public Father() { System.out.println("Father的无参构造方法"); } */ public Father(String name) { System.out.println("Father的带参构造方法"); } } class Son extends Father { public Son() { super("随便给"); System.out.println("Son的无参构造方法"); //super("随便给"); } public Son(String name) { //super("随便给"); this(); System.out.println("Son的带参构造方法"); } } class ExtendsDemo7 { public static void main(String[] args) { Son s = new Son(); System.out.println("----------------"); Son ss = new Son("jeck"); } }