在父类构造方法中调用方法会调用子类的方法
class Parent {
public Parent() {
System.out.println("init parent");
printName();
}
public void printName() {
System.out.println("name: parent");
}
}
class Son extends Parent {
public Son() {
System.out.println("init son");
printName();
}
@Override
public void printName() {
System.out.println("name: son");
}
}
public class Main {
public static void main(String[] args) {
Son son = new Son();
}
}
最终输出
init parent
name: son
init son
name: son
原因: 动态绑定到子对象的方法上了.
如果子类未定义方法, 则会调用父类的方法, 而不是自动继承下来.
class Parent {
private int a = 20;
public int getA() { return a; }
public void setA(int a) { this.a = a; }
}
class Son extends Parent {
private int a = 10;
@Override
public int getA() {
System.out.println("get a");
return a;
}
public int getSuperA() {
return super.getA();
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
parent.setA(30);
int result = parent.getA();
System.out.println(result);
Son son = new Son();
System.out.println("=====before set=====");
System.out.println(son.getA());
System.out.println(son.getSuperA());
son.setA(50);
System.out.println("=====after set=====");
System.out.println(son.getA());
System.out.println(son.getSuperA());
}
}
属性不具有多态, 只有方法具有多态.
class Parent {
public int var = 5;
public String str = "parent";
}
class Son extends Parent {
public int var = 10;
public String str = "son";
}
public class Main {
public static void main(String[] args) {
Parent son = new Son();
System.out.println(son.var);
System.out.println(son.str);
}
}
输出结果
5
parent