1.结论
①:成员变量没有多态,方法才有多态
Father gay = new Son();
gay.money 是属于父类的
((Son) gay).money 才是子类的
②:Father gay = new Son(); 在执行时,会先调用父类无参构造。除非指定super(参数)方法。
③:只有被重写的方法,使用gay.xxx()调用的才是子类的!
还有更多结论 代码一跑就知道了
public class B {
public B() {
System.out.println("B的构造器");
}
public static void main(String[] args) {
Father gay = new Son();
System.out.println("属性没有多态,son的money: " + ((Son) gay).money);
System.out.println("属性没有多态,father的money: " + gay.money);
System.out.println("-----------------------------");
System.out.println("-----------------------------");
gay.show(); //调用的是子类重写后的方法,如果想使用父类的,必须new 父类的对象
((Son) gay).showmoney(); //调用的是子类的方法
gay.showmoney(); //调用的是父类private的方法
gay.showfather(); //调用父类方法
((Son) gay).showson(); //都用的是子类方法
System.out.println("-----------------------------");
System.out.println("-----------------------------");
Father son = new Son(5);
System.out.println("属性没有多态,son的money: " + ((Son) son).money);
System.out.println("属性没有多态,father的money: " + son.money);
}
static class Father {
public int money = 1;
public Father(int money) {
money = 5;
System.out.println("father 有参构造");
}
public Father() {
money = 2;
showmoney();
show();
showfather();
}
private void showmoney() {
System.out.println("father --showmoney() 私有方法不会被重写");
}
public void show() {
System.out.println("father---show() public的重名方法会被子类重写,只调用子类的");
}
public void showfather() {
System.out.println("father --showfather() 父类特有的方法 会被调用");
}
}
static class Son extends Father {
public int money = 3;
public Son(int money) {
// super(money);
money = 6;
System.out.println("son 有参构造");
}
public Son() {
money = 4;
showmoney();
showson();
show();
}
public void showmoney() {
System.out.println("son --showmoney() 子类和父类重名的方法,如果父类private,子父类都调用");
}
public void showson() {
System.out.println("son --showson() 子类特有的方法 会被调用");
}
public void show() {
System.out.println("son---show() public的重名方法会被子类重写,只调用子类的");
}
}
}