廢話不多說,先寫一個例子友善後面的唠叨.
向上!!!!
class A{
int n ;
void tell(){
System.out.println("B類中的tell()-->n="+n);
}
void tell1(){
System.out.println()
}
void sayA(){
System.out.println("Hello,我是A類中的方法sayA()")
}
}
class B extends A{
double n ;
void tell(){
System.out.prinln("B類中的tell()-->n="+n);
}
void sayB(){
System.out.println("Hello,我是B類中的方法sayB()")
}
}
public class Demo{
puclic static void main(Sring args[]){
A a = new B() ;
a.n = 1
a.tell() ;
}
}
在上面的例子裡面定義了兩個類,一個父子A 一個子類B
在這裡大家比較迷茫包括我剛開始學的時候不明白a這個執行個體化之後裡面是什麼東西.
首先寫出我自己的記憶方式: 向上轉了之後,也就是A的執行個體了,也就是裡面的東西自然就是A的東西了.
大家會認為我上面剛才說的是廢話:
正解: a裡面的東西包含的事A裡面的東西.用代碼表示就是
class A{
int n ;
void tell(){
System.out.println("B類中的tell()-->n="+n);
}
void sayA(){
System.out.println("Hello,我是A類中的方法sayA()")
}
}
在代碼中大家看了,其中a保留了A中的原有屬性A,原來的方法sayA(),丢掉了B中的B中的sayB(),同時裡面的tell方法保留的是重寫之後的方法。通過自己運作之後的發現出現的n竟然等于0.0 不是1。
對這個是1不是0的解釋: a.n調用的是類A中的n,但是在實際的a.tell()中使用的是B中的tell() ;
用我們老師對向上轉型的解釋 就是:
繼承之後的B類中有double型的n,複寫之後的方法tell(), 繼承來的tell1(),tellA() 還有自己的sysB() .
轉型之後的a擁有的就是上面代碼中的東西了。
上面解釋之中我有一些基礎的東西隐藏了, 讀者自行了解。
向下!!!
這裡面會結合我自己自學時候的一些知識。
先來一個例子。
int x = 2 ;
float a = (float)x;
x++ ;
這時候x出來的結果是3 不是3.0
至于為什麼讀者自己了解。
同樣的在向下的時候也就是這樣的。看個代碼
class A{
int n ;
void tell(){
System.out.println("B類中的tell()-->n="+n);
}
void tell1(){
System.out.println()
}
void sayA(){
System.out.println("Hello,我是A類中的方法sayA()")
}
}
class B extends A{
double n ;
void tell(){
System.out.prinln("B類中的tell()-->n="+n);
}
void sayB(){
System.out.println("Hello,我是B類中的方法sayB()")
}
}
public class Demo{
puclic static void main(Sring args[]){
A a = new B() ;
a.n = 1
a.tell() ;
B b = new B();
b = (B)a ;
b.tell() ;
}
}
上面的例子之中a還是第一個例子之中的a沒有任何的變化。
b就是一個典型的B類了。這個時候可以認為和A類沒有任何的關系了。
在擴充一點知識:向下不能随便的向下轉的。隻能向自己的子孫轉。上面的例子中因為開始有了向上轉了(因為有繼承,是以可以向上轉) 在這個基礎之上就可以向下轉了。如果沒有這個過程的話,不能随便的鄉下轉型的。這時候一般會用到instantceof關鍵字來确定兩者之間有老子和兒子的關系。。
第一次這個用心的寫東西。寫的有點抽象,不過我可以斷定,如果你看懂了話。你不僅僅會學到轉型的東西 還會知道隐藏 instantce0f 的用法,我寫東西比較喜歡擴充。 一家之言,歡迎排磚。 為了能寫出更好的簡單易懂内容豐富的内容, 歡迎大家不吝賜教 。感謝!