![](/img/trans.png)
[英]How to call a method of a subclass / child class of an Java Object passed to JNI `jobject`
[英]Is there a way in Java to call different child method depending on which subclass is the object?
在我的項目中,我有一個超類和兩個從它擴展的子類。 超類中有一個方法在每個子類中被不同地覆蓋。 我想知道是否可以引入一種方法(在另一個類中),該方法將任一子類的 object 作為參數並調用在其中一個子類中覆蓋的方法(取決於 object 屬於哪個子類)。
public class Superclass{
public int method(){return 0;}
}
public class Subclass1 extends Superclass{
public int method(){return 1;}
}
public class Subclass2 extends Superclass{
public int method(){return 2;}
}
public class CallingClass{
public static int dependantCall(Superclass parameter){return parameter.method}
我希望能夠做類似的事情
Subclass1 subclassObject = new Subclass1;
System.out.println(CallingClass.dependantCall(subclassObject));
並得到 output
1
這就是多態性的用途。 將超類定義為參數類型將允許您傳入任一子類。
例如,在您的其他 class 中,您可以像這樣定義它:
// classes Dog and Cat extend Animal and override makeNoise()
class Owner{
playWith(Animal a){
a.makeNoise();
}
}
現在 Owner 可以接受 owner.makeNoise(cat) 和 owner.makeNoise(dog)
更多閱讀: https://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html
是的,這是完全可能的。 該方法如下所示:
public <T extends Superclass> void foo(T subclassObject) {
...
}
或者:
public void foo(Superclass obj) {
...
}
請注意,在上述方法中,您也可以傳遞子類的對象(它們是協變數據類型)。
這是 Java 在創建子類時默認執行的操作,因此無需做任何特別的事情。 每個 object 在運行時都攜帶其類型信息,調用的方法始終是 object 最具體的方法。 例子:
public class Doer {
public void doSomething() {
// Body presence
};
}
public class Painter extends Doer {
@Override
public void doSomething() {
// Paint here
}
}
public class Manager extends Doer {
@Override
public void doSomething() {
// Micromanage here
}
}
// Elsewhere in your code:
public void busyness(Doer doer) {
doer.doSomething();
}
風格說明:如果可能的話,應該更喜歡使用接口而不是基類(只有當你想在子類之間共享實現時才應該使用基類)。 接口示例:
public interface Doer {
void doSomething();
}
public class JackOfAllTrades implements Does {
@Override
public void doSomething() {
// Do whatever necessary
}
}
// Client code stays exactly the same as above:
public void busyness(Doer doer) {
doer.doSomething();
}
請注意,在 Java 中,class 只能有一個基礎 class,但可以實現多個接口。
@Override
注釋不是嚴格要求的,但它們可以幫助 Java 編譯器為您發現一些錯誤(例如,如果您打印錯誤的方法名稱)。
在您的示例中,它看起來像
public class CallingClass {
public static int dependantCall(Superclass parameter) {
return parameter.method();
}
}
Subclass1 subclassObject = new Subclass1();
System.out.println(CallingClass.dependantCall(subclassObject));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.