Java 菜鸟需要澄清奇怪的重载方法问题

标签 java oop

在我的真实代码中,我有一个创建“Foo”的对象池,我完全忘记了。问题是我从来没有首先创建“酒吧”!直到你们中的一些人提到我在示例中执行“IExample Bar”时所犯的错误,我才意识到这一点。谢谢。

我对 Java 比较陌生,我试图理解为什么这不起作用。考虑以下(非常粗略的)示例:

interface IExample {
    public void myOverriddenMethod();
    public void myMethod();
}

class Foo implements IExample {
    protected string myVar;

    public void myMethod() {
        SomeClass anotherclass = new SomeClass() {
            // assume this gets called in a listener fashion
            public void someMethod() {
                myOverriddenMethod();
            }
        }
    }

    public void myOverriddenMethod(){
        myVar = "Foo";
    }
}

class Bar extends Foo implements IExample {
    public void myOverriddenMethod(){
        myVar = "Bar";
    }
}



IExample bar = new Bar();
bar.myMethod();     // expect myVar to be equal to to "Bar", but it is equal to "Foo". 

所以看起来只有父类版本的 myOverriddenMethod() 被调用过。 Bar 的版本从来没有。我试图查找有关为什么会发生这种情况的信息,但运气不佳。

谁能解释一下这个现象?此外,欢迎建议的解决方法/设计更改。谢谢。

最佳答案

我很确定问题出在“假设以监听器方式调用它”。现在,其中没有任何内容会导致 SomeClass.myMethod() 被调用,因此也没有任何内容会导致 myOverridenMethod() 被调用。下面的修改版(如果丑陋的话)工作正常;也许你应该发布你的实际代码?

interface IExample {
    void myMethod();
    void myOverriddenMethod();
}

interface SomeListener extends EventListener {
    void someMethod();
}

class Foo implements IExample
{
    private EventListenerList ll = new EventListenerList();

    protected String myVar;

    protected Foo() {
        ll.add(SomeListener.class, new SomeListener()
        {
            @Override
            public void someMethod()
            {
                myOverriddenMethod();
            }
        });
    }

    public void myMethod() {
        for( SomeListener l : ll.getListeners(SomeListener.class) )
        {
            l.someMethod();
        }
    }

    @Override
    public void myOverriddenMethod()
    {
        myVar = "Foo";
    }
}

class Bar extends Foo {
    @Override
    public void myOverriddenMethod()
    {
        myVar = "Bar";
    }

    public static void main(String[] args) {
        IExample bar = new Bar();
        bar.myMethod();
        System.out.println(((Bar) bar).myVar);
    }
}

关于Java 菜鸟需要澄清奇怪的重载方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690869/

相关文章:

php - 工作中的PHP编码标准: Insane,还是我?

java - 这个 for 循环如何知道这个数组数据结构从一开始有多长?

java - JavaBean 和 POJO 有什么区别?

python - 使用Python API以编程方式克隆Kubernetes对象

java - 处理同名继承方法的规则是什么?

python - 我收到错误 _tkinter.TclError : bad window path name ".!button" and i'm not sure why

java - 在java中运行bat文件不起作用

java - 设置键盘焦点

java - Spring Boot 和@ConfigurationProperties

objective-c - 子类是否继承委托(delegate)回调?