我有一個主類,一個X類和一個Z類。覆蓋方法,無需更改任何原始代碼
X有方法a()。
Z有方法b()。
主要調用方法B()中的Z,然後方法()在十
然後,我有我的課X2與它的方法A2()。
是否可以在不改變Main或X的情況下強制Main通過Z的b()方法從X2中使用方法a2()而不是X中的方法?
我有一個主類,一個X類和一個Z類。覆蓋方法,無需更改任何原始代碼
X有方法a()。
Z有方法b()。
主要調用方法B()中的Z,然後方法()在十
然後,我有我的課X2與它的方法A2()。
是否可以在不改變Main或X的情況下強制Main通過Z的b()方法從X2中使用方法a2()而不是X中的方法?
不,你不能這樣做,因爲Main類仍然創建一個X X x = new X()
的實例。
讓Main類調用一個方法覆蓋X.a()
的唯一方法是將Main中的調用更改爲X x = new X2()
。
如果我理解你的問題,那麼是的,如果Z負責創建X,X2擴展X.這稱爲多態。考慮這個例子:
public class X {
public void a() {
System.out.println("X.a");
}
}
public class X2 extends X {
public void a() {
System.out.println("X2.a");
}
}
public class Z {
private X my_x;
public Z() {
this.my_x = new X2();
}
public X getX() {
return my_x;
}
public void b() {
System.out.println("Z.b");
}
}
public class Main {
public static void main(String[] Args) {
Z z = new Z();
X x = z.getX();
z.b();
x.a(); // this prints. X2.a
}
}
爲什麼不*顯示*我們的代碼而不是*描述*它? – NPE
那麼爲什麼你不只是將Z.b()中的方法調用從()改爲a2()呢? – RoflcoptrException
你的問題的答案是「否」我假設你說「改變」時,你指的是改變源代碼或改變類與像AspectJ或其他字節代碼工具工具一樣加載類。 –