廢話不多說,先寫一個例子方便後面的嘮叨.
向上!!!!
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關鍵字來確定兩者之間有老子和兒子的關係。。