【问题标题】:Java Method Overriding - accessing methods in parent - is this possible?Java 方法覆盖 - 访问父级中的方法 - 这可能吗?
【发布时间】:2011-07-08 01:46:22
【问题描述】:

假设我创建了一个类的实例并同时覆盖了它的一个方法 - 就像这样

MyClass fred = new MyClass() {
    @Override
    public void mymethod() {
        super.mymethod();
        //call something here
    }
};

现在让我们假设我想调用一个本地方法,它与我的重写方法具有相同的名称和相同(缺少)参数 - 例如我有

public void mymethod() {
    //my stuff in here
}

如何从被覆盖的方法中调用它(在 //call something here 线上)???

这可能吗?使用

this.mymethod();  

导致无限循环(被覆盖的方法只是调用自身)

有没有办法访问这个方法(也许不是通过静态引用?)

对不起,如果这是一个常见问题 - 这是一件很难搜索的事情,而且我发现的一个问题没有回复,而且措辞也不是很好,所以我正在尝试自己!!

【问题讨论】:

  • 您能链接到其他相关问题吗?也许我们也可以回答这个问题……
  • 我不是 100% 确定它在 StackOverflow 上 - 在这里浏览我的历史记录并没有显示出来,所以我怀疑它在一个“克隆”网站上 - 如果我有机会遇到再说一遍,我会在这里链接它

标签: java methods reference overriding naming


【解决方案1】:

我手边没有编译器,所以我不能 100% 确定,但试试这个:

ParentClass.this.myMethod();

【讨论】:

  • 不过,这不是一个技巧,它是寻址封闭实例的定义的一部分。如果this 的实际类型为T,则在调用实例方法时始终可以使用T.this 作为限定符。
  • @John Peat:不,JLS §15.8.4 Qualified this 适用。
  • @trashgod 现在我真的在学习新东西 - 再次感谢!!
  • 正确的答案但没有很好地表达,因为包含的类可能不是 MyClass(问题中没有指定) - 你想要 ParentClass.this.mymethod() 其中 ParentClass 可能是 MyClass,但可能不是。
  • 我很高兴它起作用了......当它突然出现在我的脑海中时,我已经很久没有使用它了,好吧,假设我的耳朵生锈了。 @Mark,我不知道 ideone - 感谢您向我介绍它。
【解决方案2】:

一个丑陋但有效的解决方案:

final MyOtherClass parent = this;

MyClass fred = new MyClass() {
    @Override
    public void mymethod() {
        super.mymethod();
        parent.mymethod();
    }
};

我很难看到出于命名目的需要这样做的场景,但知道匿名类中的this 将引用匿名类而不是“父类”是很有用的;因此,如果您发现需要访问父级的方法,这是一种有用的技术。

FWIW,这是working example

【讨论】:

  • 啊 - 这有点明显(我现在感觉有点笨拙)!我意识到,理想情况下,我会使用不同的名称——如果没有其他原因,只是为了提高可读性——但这可能很有用——谢谢!
  • @John:是的,确切的用例还不清楚,但我可以想象你被无法控制的 API 卡住的情况。
【解决方案3】:

我不确定我是否完全理解了这个问题,但我猜你想要这样的东西:

public class ParentClass {
    public void mymethod() {
        ....
    }

    public void someOtherMethod() {
        MyClass fred = new MyClass() {
            @Override
            public void mymethod() {
                super.mymethod();
                //call something here
                ParentClass.this.mymethod();
            }
        }
    }
}

注意ParentClass.this.mymethod()

【讨论】:

  • 确实是这样,但@Paul 稍微击败了@Charles - 谢谢!
  • 实际上这不是我的答案,这是 Alex Gitelman 的答案,他击败了保罗,但保罗修改了他的答案。哈哈,不断发展的互联网,它改写了短期历史!
  • @Charles 我认为实际上保罗是第一个。我的观察是,一旦您尝试详细说明答案,您就会失去上市时间,并且有人会击败您:)
  • @Alex Gitelman:是的,我的意思是你是第一个发布准确答案的人,保罗发布了他的第一个,但最初有点困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
相关资源
最近更新 更多