1. 在子类的一个构造方法中,this() 和 super() 只能存在一个,因为他两都必须被定义在构造方法的第一行,但是如果创建子类对象使用的构造方法,由于使用了this() 调用了其他子类的构造方法,导致该构造方法不能再使用super()调用父类的构造方法,但是肯定会有一个子类的构造方法使用super()调用父类的构造方法。
class SuperClass{public int sex;public SuperClass(){}public SuperClass(int sex){this.sex = sex;}}class SonClass extends SuperClass{public int age;public String name;public SonClass(){// 这里默认会有 super() 来调用父类构造函数// 至少有一个构造函数 可以使用 super() 来调用父类构造函数}public SonClass(String name){this(); // 由于使用this()调用无参构造 不能使用super()this.name = name;}public SonClass(String name , int age){this(name);// 由于使用this(name)调用其他构造函数 不能使用super()this.age = age;}public SonClass(int sex){//这里可以使用super() 调用父类的任意构造函数super(sex);}@Overridepublic String toString() {return "SonClass{" +"sex=" + sex +", age=" + age +", name='" + name + '\'' +'}';}
}public class ThisSuperTest {public static void main(String[] args) {SonClass sonClass = new SonClass("张三");System.out.println(sonClass);}}SonClass{sex=0, age=0, name='张三'}
2.子类成员变量的显示赋值在调用super()实例化父类之后,所以在调用super()的过程中,子类成员变量的值都是默认赋值,直到super()执行完毕,才会对子类成员变量进行显示赋值。
class Super{public Super(){System.out.println("Super constructor print son age " + getAge());printAge("Super");}public int getAge(){return 50;}//这个方法会被子类覆盖,所以不会执行,会执行子类的实现public void printAge(String name){System.out.println(50);}
}class Son extends Super{private int age = 20;public Son(){super();System.out.println("son constructor print age " + age);printAge("son");}public int getAge(){return this.age;}public void printAge(String name){System.out.println(name + " call printAge method " + this.age);}
}public class MemberFieldAssignment {public static void main(String[] args) {Son son = new Son();}}运行结果:
Super constructor print son age 0 //在调用super()过程中访问age,age还是默认值
Super call printAge method 0 //在调用super()过程中访问age,age还是默认值
son constructor print age 20 //在调用super()完毕之后访问age,age已经显示赋值
son call printAge method 20 //在调用super()完毕之后访问age,age已经显示赋值