![](/img/trans.png)
[英]JAVA: what happend when i call a getter method of a object which actually extend the method from it's superClass
[英]Java inheritance call object's superclass's method
我有一個A類:
A
- void method1
並且擴展A的B類覆蓋A的方法1:
B->A
- void method1
稍后,我創建了一個引用為A的B實例:
A a = new B();
我想在特定情況下使用方法1的A版本。 有沒有辦法稱之為,如:
a.super.method1();
為了消除任何困惑,這是我想要實現的目標:
我有一個名為Account的父類。 在那之下我有3個子類,SavingsAccount,CheckingAccount和MoneyMarketAccount。
其中每一種都有自己的存款/取款方式,這些方法具有與之相關的特定費用。
有一個名為Bank的管理器類,其中包含一個Account對象的ArrayList。 我有一個方法,無法void transfer
,我試圖創建,這將允許我拿兩個帳戶,並在他們之間轉移資金。
如果沒有足夠的資金或其他錯誤,有時不同的方法會拋出異常,所以如果兩個賬戶中的一個賬戶失敗,我需要能夠撤銷交易。
這是我遇到問題的地方:
如果to-account
無法收到存款,我需要重新存入從from-account
提取的款項,但是to-account
可能有存款費用,所以我想撥打父賬戶類的存款方式,就像它一樣沒有任何費用; 但是,根據我收到的評論和答案,我可能只需編寫另一種不被覆蓋的方法,只需執行與帳戶存款相同的操作即可。
你不能直接使用super,因為它只存在於 B 內部 。但是你可以間接地使用它:
public B extends A {
public void method1() {
// B's method 1
}
public void superMethod1() {
super.method1();
}
}
因此,如果一個類使用B變量,那么他們可以調用superMethod1()
並獲取A的method1。
但話雖如此,這對A變量不起作用,因為您的代碼當前已設置,而不是沒有強制轉換。
即,你可以這樣做:
B b = new B();
b.superMethod1();
但是這對你的設置不起作用:
A a = new B();
// not without casting
((B)a).superMethod(); // ugh... ugly! AND dangerous!
請注意,你的問題,雖然本身並不壞,但表明可能是一個糟糕的程序設計和需要它的代碼至少對我來說,代碼味道很差。
您只能在課堂上使用super
或this
關鍵字。 您不能在該課程之外使用它們。
所以在課堂上你可以做(模擬代碼)
class A {
someMethod(){
super. someMethod()
}
}
你不能從客戶端代碼那里做到這一點,即。 調用方法的代碼。 您只能在子類方法中執行此操作
super.method1();
並且僅適用於層次結構的一個級別。
使用A a = new A();
或者你可以從B的方法1調用super.method1(),如果你想要像A a = new B();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.