【问题标题】:Override method without changing any original code [closed]在不更改任何原始代码的情况下覆盖方法[关闭]
【发布时间】:2013-01-24 17:20:56
【问题描述】:

我有一个 Main 类、一个 X 类和一个 Z 类。

X 有方法 a()。

Z 有方法 b()。

Main 调用 Z 中的方法 b(),然后调用 X 中的方法 a()。

然后我有我的类 X2 及其方法 a2()。

是否可以在不更改 Main 或 X 的情况下通过 Z 的 b() 方法强制 Main 使用 X2 中的方法 a2() 而不是 X 中的 a()?

【问题讨论】:

  • 您为什么不向我们展示代码而不是描述它?
  • 那么为什么不直接将 Z.b() 中的方法调用从 a() 替换为 a2()?
  • 您的问题的答案是“否”,我假设当您说“更改”时,您指的是更改源或更改加载了 AspectJ 或其他字节码之类的类检测工具。

标签: java class methods overriding


【解决方案1】:

不,你不能这样做,因为 Main 类仍然创建 X X x = new X() 的实例。

让 Main 类调用覆盖 X.a() 的方法的唯一方法是将 Main 中的调用更改为 X x = new X2()

【讨论】:

    【解决方案2】:

    如果我理解您的问题,那么如果 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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-19
      • 1970-01-01
      • 2020-08-11
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2012-07-01
      相关资源
      最近更新 更多