子类对象在实例化之前会默认调用父类的构造方法。
class Person {
private String name;
private int age;
public Person() {
System.out.println("person constructor");
}
}
class Student extends Person {
private String school;
public Student() {
System.out.println("student constructor");
}
}
public class Test {
public static void main(String args[]) {
Person a = new Student();
}
}
运行结果:
person constructor
student constructor
接下来是关于方法覆盖的问题
public class Override {
public static void main(String args[]) {
new Student().fun();
}
}
class Person {
private void print() {
System.out.println("spuer print()");
}
public void fun() {
this.print();
}
}
class Student extends Person {
void print() {
System.out.println("child print()");
}
}
运行结果:
spuer print()
并不是想象中的super print(),因为父类中的print()方法是private访问的。所以子类中的print方法是相当于定义了一个新的方法。所以执行的是父类中的方法。
public class Override {
public static void main(String args[]) {
new Student().fun();
}
}
class Person {
void print() {
System.out.println("spuer print()");
}
public void fun() {
this.print();
}
}
class Student extends Person {
public void print() {
System.out.println("child print()");
}
}
运行结果:
child print()
注意两个程序中print方法中的访问修饰符。