我有一個類庫,我沒有寫,它定義了幾個類和子類,它們有靜態方法。一個非常精簡例如:當我擁有一個對象時,我可以調用靜態java方法嗎?
public class Vehicle {
static String getName() { return "unknown"; }
}
public class Car extends Vehicle {
static String getName() { return "car"; }
}
public class Train extends Vehicle {
static String getName() { return "train"; }
}
現在,我有一個對象,它是車輛,可以是汽車或火車,想調用它的的getName()函數。再次,很精簡:
public class SMCTest {
public static void main(String[] args) {
Vehicle vehicle=new Car();
System.out.println(vehicle.getName());
}
}
這將打印「未知」,而不是「車」,因爲JVM不需要,或使用對象調用靜態方法,它只是使用了類。
如果這是我的代碼,我會重寫汽車庫使用單身和非靜態方法,但因爲它不是我的代碼,我寧願不要觸摸它。
有什麼辦法可以調用對象的「真實」類的靜態方法,最好不使用反射?如果有幫助,我可以將上述示例中的vehicle
更改爲Class <? extends Vehicle>
變量並使用該變量,但我看不出如何幫助我避免反射。
是的,有。因爲您已經知道它的具體類別:「汽車=新車()」,因此您可以簡單地向下拖動「車輛」對象。然後'vehicle.getName()'會返回* car *。不過,這樣做會導致警告,因爲您不應該通過實例訪問靜態方法。 – aribeiro
'Car.getName()'? – Filkolev
你似乎想要一個靜態方法以多態的方式表現。這是不可能的。使用該對象來調用靜態方法顯示了一個應該解決的設計問題。靜態方法應該是一個實例方法。 –