Posted on 2008-08-07 01:49
freedoom 閱讀(577)
評論(0) 編輯 收藏 所屬分類:
JAVA技術
package dao;
class Father{
void method(){
System.out.println("Father method called.....");
}
}
class Son extends Father{
void method(){
System.out.println("Son method called.....");
}
}
publicclass TestAbstract{
publicstaticvoid main(String args[]){
Father f;
Son son=new Son();
f=son;
// Father f=new Son();
f.method();
}
}
|
為什么可以用Father f=new Son();
因為Father的范圍比Son的范圍大,編輯器會幫助我們將子類的類型的自動轉換為父類的類型,這即是父類的引用,子類的對象,
(注意:這里子類Son已經重寫了父類的method()方法,所以當運行f.method();時調用的是子類的方法,所以這里可以得出兩點結論,即:
Father f=new Son();運行時:
1.)是父類的引用,子類的對象,實際運行時調用的是被子類重寫的方法。
2.)子類重寫父類的方法,只能重寫父類公共的、非靜態的方法。
同理)
|
以下是接口引用的問題:注意其中的區別。
接口引用
static void Main(string[] args)
{
IBankAccount venusAccount = new SaverAccount();
IBankAccount jupiterAccount = new CurrentAccount();
venusAccount.PayIn(200);
jupiterAccount.PayIn(500);
Console.WriteLine(venusAccount.ToString());
jupiterAccount.PayIn(400);
jupiterAccount.Withdraw(500);
jupiterAccount.Withdraw(100);
Console.WriteLine(jupiterAccount.ToString());
}
請注意開頭兩句,我們把它們聲明為IBankAccount(這是一個接口)引用的方式,而沒有聲明為類的引用,為什么呢?因為,這樣我們就可以讓它指向執行這個接口的任何類的實例了,比較靈活。這也就是接口回調。但這也有個缺點,如果我們要執行不屬于接口的方法,比如這里重載的ToString()方法,就要先把接口的引用強制轉換成合適的類型了。
接口回調的例子:
interface People{
void peopleList();
}
class Student implements People{
public void peopleList(){
System.out.println("I’m a student.");
}
}
class Teacher implements People{
public void peopleList(){
System.out.println("I’m a teacher.");
}
}
public class Example{
public static void main(String args[]){
People a; //聲明接口變量
a=new Student(); //實例化,接口變量中存放對象的引用
a.peopleList(); //接口回調
a=new Teacher(); //實例化,接口變量中存放對象的引用
a.peopleList(); //接口回調
}
}
結果:
I’m a student.
I’m a teacher