參考鏈接: 用子類引用子類對象 vs 父類引用
public class Father {
? ? private String name;
? ? private int age;
? ? private int weight;
? ??
? ? public void eat() {
? ? ? ? System.out.println("Father is eating");
? ? }
? ??
? ? private void run() {
? ? ? ? System.out.println("Runing....");
? ? }
? ??
? ? public Father() {
? ? ? ? name = "zhangsan";
? ? ? ? age = 23;
? ? ? ? weight = 60;
? ? }
? ??
? ? public static void main(String[] args) {
? ? ? ? /*
? ? ? ? ?*
? ? ? ? ?*如果子類的構造方法中對繼承來自父類的變量重新賦予新的值的話,那么這樣子調用的將會是子類的變量
? ? ? ? ?*如果子類重新定義了和父類一樣的變量的話那么這樣將會輸出的是父類的變量??
? ? ? ? ?*Father f = new Son();
? ? ? ? ?*f.age f.weight
? ? ? ? ?*/
? ? ? ? Father f = new Son();
? ? ? ? f.eat();
? ? ? ? f.run();
? ? ? ? System.out.println("。。。。。。年齡是:" + f.age + "\t" + f.weight + "\t" + f.name);
? ??????
//? ? ? ? Son s = new Father();這樣子會報錯
? ? }
}
?
class Son extends Father{
?
? ? private int salary;
?
? ? public void eat() {
? ? ? ? System.out.println("Son is eating");
? ? }
? ??
? ? public void sleep() {
? ? ? ? System.out.println("sleep ....");
? ? }
? ??
? ? public Son() {
? ? ? ? name = "lisi";
? ? ? ? age = 3;
? ? ? ? salary = 60;
? ? ? ? weight = 70;
? ? }
?
? ? public int getAge() {
? ? ? ? return age;
? ? }
?
? ? public void setAge(int age) {
? ? ? ? this.age = age;
? ? }
}
?
最終輸出的結果? f.eat()輸出的是子類中重寫父類中的eat()方法?
f.run()輸出的是父類中的run()方法(實際上是輸出的子類中的,只是因為子類中沒有重寫,所以看上去輸出的是父類中的,實際調用的是子類的)?
f.age和f.weigth輸出的是子類的構造方法中重新賦值的?
f.name輸出的是父類中的屬性?
由此可以看出,父類引用指向子類對象,最終這個父類引用所擁有的變量是是子類中的(如果構造方法中沒有重新賦值那就和父類中的一樣,如果重新賦值了那就是子類中賦值以后的),方法也是子類中的(如果重寫了就是重寫之后的方法,如果沒有重寫的那就和父類中的一樣)