Java中(向上,向下)造型造型和介面回撥中的問題
最近回顧了一下java繼承中的問題,下面貼程式碼:
執行結果package com.cc; /** * 目的:問題驗證,關於向上和向下造型過程中,檢測存在繼承關係的物件訪問關係。 * * * @author Character_Painter * */ public class Base { protected String temp = "base"; public void fun(){ System.out.print("BASE fun()"); } public static void main(String[] args) { Base b =new Base();//例項化Base物件 b.fun(); //呼叫父類中fun()的方法 System.out.println(b.temp);//訪問父類中的成員變數temp /*****************************************************/ System.out.println("/***************/"); Son son = new Son();//例項化Son物件 son.fun(); //呼叫son的fun方法 System.out.println(son.temp);//訪問son的成員變數temp Son S_son=new Son(); //例項化Son物件 Base B_s =(Base)S_son; //向上造型-----------相當於Base s =new Son(); B_s.fun(); //呼叫子類的fun()方法 System.out.println(B_s.temp);//訪問父類的成員變數temp /******************************************************/ System.out.println("/***************/"); Base s =new Son();//向上造型 s.fun(); //呼叫子類的方法 System.out.println(s.temp);//呼叫父類的成員變數temp Base ba =new Son(); Son so = (Son)ba; //向下造型 so.fun(); //呼叫子類的fun()方法 System.out.println(so.temp);//訪問子類的成員變數temp } } class Son extends Base{ protected String temp = "Son"; public void fun(){ System.out.print("SON fun()"); } }</span>
BASE fun() base
/***************/
SON fun() Son
SON fun() base
/***************/
SON fun() base
SON fun() Son
結論總結:
1、父類的引用變數可以指向子類物件,子類的引用變數不能指向父類物件。
2、向上造型(upcasting):把子類物件直接賦給父類引用,向上轉型不用強制轉型。如:
Base base = new Son(); 向上造型--隱式
3、向下造型(downcasting):把指向子類物件的父類引用賦給子類引用,要強制轉型。
Base b= new Son();
Son s = (Son)base;----------向下造型--必須強制轉換,且必須有繼承關係
4、upcasting 會丟失子類特有的方法,但是子類overriding 父類的方法,子類物件去 呼叫方法有效
5、呼叫方法或成員變數的規律:
前提:子類存在重寫方法,父類和子類中同時有相同名稱的成員變數。
(1)當進行了向上造型的引用型變數---父類引用變數只能呼叫子類的重寫方法,但父類的引用變數只能訪問父類中的成員變數
(2)當進行了向下造型的引用型變數---子類引用變數只調用子類重寫方法,子類的引用變數只能訪問子類的成員變數。
(3)自己想了個通俗的說法,呼叫方法,得當前的引用變數指向的物件;呼叫變數,得看當前引用變數的型別。
即,調方法,藍物件,調變數,看型別。(可以試驗一下)
介面回撥與向上造型package com.cc;
/**
* 介面回撥,和向上造型的對比
* @author Character_Painter
*
*/
public class Inter extends Father implements Person,Teacher{
public void study(){
System.out.println("學習");
}
public void sleep(){
System.out.println("子類sleep()方法");
}
public static void main(String[] args) {
Father f = new Inter();
f.sleep();//向上轉型---呼叫
Person p=new Inter();
p.eat(); //介面回撥方法
Teacher t = new Inter();
t.teach(); //介面回撥方法
}
@Override
public void eat() {
System.out.println("重寫eat()方法");
}
@Override
public void teach() {
System.out.println("重寫teache()方法");
}
}
interface Person{
public void eat();
}
interface Teacher{
public void teach();
}
class Father{
public void sleep(){
System.out.println("父類sleep()方法");
}
}
其實:
使用介面方式,其目的應該是實現多個父型別的方法實現,強調一個多種實現,而向上造型,針對的是一對一的繼承關係,向上造型後,可以呼叫子類的重寫的方法。這就是我認為他們的區別。