在创建子类对象时,父类的构造方法会先执行,因为子类中所有构造方法的第一行有默认的隐式super();语句
注意:父类构造方法第一行也有隐式的super();
所有类都有一个"祖宗类":Object,父类继承的就是它
super();和上一篇的this();有相似之处:
this();是调用自己的空参构造方法
super();是调用父类的空参构造方法
示例:
public class Person { public Person(){ System.out.println("父类构造方法"); } }
public class Student extends Person { }
public class Test { public static void main(String[] args) { new Student(); } } //输出:父类构造方法
//这里体现了隐式的super();
子类和父类内存原理重点:
创建子类对象对象空间中,划分成两个区域,一部分留给父类,用super标记,一部分留给自己,用this标记
父类的成员变量跟随子类进入到划分给父类的区域
不过,父类的构造方法如果有参数,则子类必须写全
子类可以重载构造方法,不过第一行必须是super()
父类如果有多个构造方法,子类任意调用一个即可
示例:
public class Person { public Person(int a){ System.out.println(a); } public Person(double d){ System.out.println(d); } }
public class Student extends Person { public Student() { super(0); } public Student(String s) { super(1.5); System.out.println(s); } }
public class Test { public static void main(String[] args) { new Student(); new Student("..."); } } /*输出: 0 1.5 ... */
这里发现一个矛盾:this()和super()都必须写在构造方法的第一行,因此这两个关键字不能共存
但必须保证子类的所有构造方法直接或间接调用到父类的构造方法即可
示例:
public class Person { public Person(int a){ } }
public class Student extends Person { public Student(){ //调用自己的构造方法 //间接形式调用到了父类的构造方法 this("..."); } public Student(String s){ super(2); } }
为了更好地理解super,这里写一个super的应用:
public class Person { private String name; private int age; public Person(String name, int age){ this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
public class Student extends Person { public Student(String name,int age){ super(name, age); } }
public class Worker extends Person { public Worker(String name,int age){ super(name, age); } }
public class Test { public static void main(String[] args) { Worker worker = new Worker("张三", 18); Student student = new Student("李四", 19); System.out.println(worker.getName()); System.out.println(student.getAge()); } }