❶ java多態問題。
其實多態很簡單的,不要把它理解的過難。
每個Java程序的引用變數(你這個裡面引用變數就是a),都有編譯類型和運行類型。編譯就是將 .java文件編譯成 .class文件,而運行就是 .class文件在操作系統上運行。
那麼,這個時候,就出現多態了,一個類,他在編譯時期和運行時期相同的動作卻出現了不同的結果。Animal a = new Cat(); 如你的這個,a在編譯的時候,只能調用Animal裡面的方法和屬性,而不能調用Cat的方法和屬性。
要注意的是,這樣寫Animal a = new Cat(); 後面的Cat必須繼承Animal類,為了出現多態,Cat類中必須重寫Animal的方法。所謂重寫,就是要有和父類Animal中有一模一樣的方法。
編譯的時候,a調用的是自己的方法,我們可以預測結果,但是運行的時候,卻出現了不同的結果,因為他這個時候調用的是Cat的方法,這就是多態。
多態呢,很簡單,面向對象嗎,動物是總類,他又自己特定方法,繼承與他的其他動物也有這個特定方法,但是他們方法結果不一樣的。
多態,也僅僅是指類的方法,與屬性沒有任何關系。
Animal a = new Cat(); a這個引用變數指向了Cat這個對象。
優點是:統一化
❷ Java程序如圖,多態,為什麼編譯不通過f.function這里為什麼不能
子類可以調用父類不受保護的方法,但是當子類轉換成父類時候,父類不能調用子類的方法。類型轉換,這種轉換在java中是自動實現的
❸ java 多態,變數不能被重寫,為什麼
多態中的方法是可以重寫的,但是變數不能重寫,你運行一下這個看看結果就知道了,父類聲明,子類實例化,用這個對象去調方法是子類的方法,但是去調屬性,就是父類的了。
public class A {
public String a="a";
public void A(){
System.out.println("我是A類中的A方法");
}
}
public class B extends A {
public String a="b";
public void A(){
System.out.println("我是B類中的A方法");
}
public static void main(String[] args) {
A b = new B();
b.A();
System.out.println(b.a);
}
}
結果:
我是B類中的A方法
a
❹ java習題,多態的用法,這段代碼無法輸出結果,誰能幫我找出錯誤!
你的 Test 類應該這樣寫:
publicclassTest{
publicstaticvoidmain(String[]args){
//Operationop=newOperation(10.0,20.0);
Operationo;
o=newOpeartionAdd(10.0,20.0);
o.getResult();
o=newOpeartionCha(10.0,20.0);
o.getResult();
}
}
你的OpeartionCha類中的getResult 方法如果是希望它是覆蓋父類的 getResult 方法的話,那麼OpeartionCha類中的getResult 方法和父類的 getResult 方法應該參數聲明是一致的,即OpeartionCha類中的getResult 方法 也應該是無參的才對。所以OpeartionCha類 應該是這樣:
{
publicOpeartionCha(){
}
publicOpeartionCha(doublenum1,doublenum2){
super(num1,num2);
}
@Override
publicvoidgetResult(){
doublecha=(super.getNum1()-super.getNum2());
System.out.println(cha);
}
}
建議寫代碼的時候如果是覆寫方法,把 @Override 加上,這樣如果覆寫有誤,編譯階段就可以給出提醒。
❺ C++中,我的多態,為什麼不成功呢編譯運行後選哪個結果都是一樣的~
因為你的Mammal類裡面speak函數定義的是非const的,而繼承類中是const的,這樣多態機制是無法識別的,把speak後面也加上const就可以了
❻ C++多態的一個練習,基類是CAccount,CSavings,CChecking分別為子類,編譯老是提示:error C2143:
你的想法是沒有問題的,將Withdrawal()函數作為虛函數,然後派生類里實現,在實際調用時會根據實際類型調用相應函數實現,我在自己機器上簡單的把你的程序模擬了一遍是沒有問題的,你看看是不是其他函數的問題。
class CAccount
{
public:
CAccount(){}
~CAccount(){}
virtual void Withdrawal()=0; //取款
};
class CSavings:public CAccount
{
public:
CSavings(){}
~CSavings(){}
void Withdrawal();
};
class CChecking:public CAccount
{
public:
CChecking(){}
~CChecking(){}
void Withdrawal();
};
void CSavings::Withdrawal()
{
cout << "CSavings Withdrawal" << endl;
}
void CChecking::Withdrawal()
{
cout << "CChecking Withdrawal" << endl;
}
void fn(CAccount* account)
{
account->Withdrawal();
}
int main()
{
CSavings saving;
CChecking cheching;
fn(&saving);
fn(&cheching);
return 1;
}
輸出是:
CSavings Withdrawal
CChecking Withdrawal