JAVA學習筆記 物件的上轉型物件(子類物件當作父類物件來使用)
世界萬物無非就是吃喝玩樂繁衍生息,傳宗接代是重中之重,這樣長久以來就構成了我們地球上的生態系統,java也是這樣,只不過這裡面更加直接和純粹,就用學生和人類做一下例子,學生一定是人類對吧?(苗紅根正的當代優秀青年不相信怪力亂神)所以說人類一定就是學生的父類,學生就是人類的子類。大圓之中包涵小圓,這就是程式猿的暴力美學?
而下面我要說的就是和這個模式很相似的上轉型物件。
我們已經假設了人類是學生的父類,當我們用子類學生建立一個物件並把這個物件的引用放進父類的物件之中的時候,例如:
student a;
a=new human();
或者這樣:
student a;
human b=new human();
a=b;
這時候我們就稱a是b的上轉型物件。
我們不難看出,上轉型物件的實體是子類負責建立的,看上去完美無缺但是其實它會失去原有物件的一些屬性(就像是子類物件的一個“簡化”物件)上轉型物件有如下特點:
(1)不能操作子類新增的成員變變數(丟失這部分屬性)不能呼叫子類新增的方法(丟失了部分方法)
(2)上轉型物件可以訪問子類繼承或隱藏的成員變數,也可以呼叫繼承的方法或者是重寫的例項方法。這裡需要注意的是上轉型物件操作子類繼承的方法或是子類重寫的例項方法,其作用等價於子類物件去呼叫這些方法。(也就是說呼叫重寫後的方法時用的是子類重寫的)
注意:
物件的上轉型物件只能使用:隱藏的變數,繼承的變數,繼承或重寫的方法。而子類新增的變數和方法則無法使用
空口無憑,程式碼見:
class 類人猿{
void crySpeaking(String s){
System.out.println(s);
}
}
class People extends 類人猿{
void computer(int a,int b){
int c=a*b;
System.out.println(c);
}
void crySpeaking(String s){
System.out.println("aaaaa"+s+"aaaaa");
}
}
public class shiyan{
public static void main(String args[]){
類人猿 monkey;
People wu=new People();
monkey =wu; //monkey是people物件wu的上轉型物件
monkey.crySpeak("i love this game"); //等同於wu.crySpeaking("i love this game");
People people=(People)monkey; //把上轉型物件強制轉換為子類物件
people.computer(10.10);
}
}
執行結果是
aaaaa i love this game aaaaa
100
需要注意的是monkey.computer(10.10);是錯誤的,因為computer是子類新增的方法。