本文共 2208 字,大约阅读时间需要 7 分钟。
在具有继承关系对象的创建过程中,构建子类对象会先构建父类对象,先走父类构造器。
super():表示调用父类无参构造方法,如果没有显示书写,则默认隐式存在于子类构造方法的首行
public class Test { public static void main(String[] args) { new C(); }}class A{ public A(){ System.out.println("A"); }}class B extends A{ public B(){ super(); System.out.println("B"); }}class C extends B{ public C(){ super(); System.out.println("C"); }}
如果父类没有显示的无参构造方法时,子类继承父类,则需要在子类构造器中调用父类的有参构造方法;
class A{ public A(String A){ System.out.println("A"); }}class B extends A{ public B(){ super(null); System.out.println("B"); }}
类是模板,可服务于此类的所有对象;this代表当前实例,是类中的默认引用;当类服务于某个对象时,this则指向这个对象
//当创建s1对象时,this指向0x0000AO01,访问的name属性即是Ox0000A001地址中的name空间;//当创建s2对象时,this指向Ox0000B002,访问的name属性即是Ox0000B002地址中的name空间;public class Test { public static void main(String[] args) { Teacher s1 = new Teacher(); s1.sayHi(); Teacher s2 = new Teacher(); s2.sayHi(); }}class Teacher{ String name; public void sayHi(){ System.out.println(this.name); }}
this的两种用法
**注意:**构造器在调用其他构造器的时候要放在构造器的首行,还要防止构造递归,造成死循环。
在子类中可直接访问父类的属性和方法,当子类中的属性和方法与父类发生遮蔽和重写,需要加以区分,才可以专项访问。
public class TestSuperKeyword ipublic static void main(String[] args) { B b = new B(); b.print(); }}class A{ int value = 10;}class Bextends A{ int value = 20;public void print(){ int value = 30; System.out.print1n(value); System.out.print1n(this.value);System.out.print1n(super.value); }}//运行结果30 20 10//父子类属性同时存在不存在重写,子类遮蔽父类属性,需要使用不同前缀进行访问。
子类的默认无参构造器默认隐藏super()先执行父类的无参构造器。super()默认放在第一行。
1.第一种用法
2.第二种用法
如果一个类继承了其他类,那当初始化时super会默认调用父类的无参构造方法,或super调用有参的构造方法,然后再完成子类特有属性的初始化。而在构造函数中,this调用的是其他构造函数,而其他构造函数中也有super存在,这样就存在两个super,意味着父类的两次初始化,这不安全。
转载地址:http://wtqcuy.baihongyu.com/