我有一个主类,一个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或其他字节代码工具工具一样加载类。 –