Java:覆盖私有函数

时间:2012-11-08 04:43:21

标签: java inheritance

我们在Tree类中发现了一个GWT错误(由Google修复,但在较新的版本中)。需要修复的功能是私有功能。我想知道是否有任何方式来覆盖私有功能。如果需要它可能是hacky,但如果有办法,请告诉我。

我可能会尝试弄清楚如何更改GWT代码并重新编译为另一种选择,但如果我可以派生一个类(“MyTree”)并以某种方式覆盖此功能,那将会更容易。

6 个答案:

答案 0 :(得分:4)

无法覆盖私人功能。它基本上就像它们不存在于亚型中一样。

在超类调度到子类覆盖的意义上,它们也不能被覆盖。

一个具体的例子可能证明是有用的:

public class Test
{

    public static void main(String[] args)
    {
        (new B()).privateGo();
        (new B()).protectedGo();
        (new C()).privateGo();
    }

}


class A
{
    public void privateGo()
    {
        _privateGo();
    }

    public void protectedGo()
    {
        _protectedGo();
    }

    private void _privateGo()
    {
        System.out.println("A._privateGo");
    }

    protected void _protectedGo()
    {
        System.out.println("A._protectedGo");
    }

}

class B extends A
{

    private void _privateGo()
    {
        System.out.println("B._privateGo");
    }

    protected void _protectedGo()
    {
        System.out.println("B._protectedGo");
    }

}

class C extends A
{
    public void privateGo()
    {
        _privateGo();
    }
    private void _privateGo()
    {
        System.out.println("C._privateGo");
    }
}

输出将是:

A._privateGo
B._protectedGo
C._privateGo

受保护的方法将被分派到子类实现。私人方法不会。从这个意义上说,就像子类型不存在私有方法一样。

您必须更新到固定版本的GWT或编辑源。请注意C的privateGo将如何发送给C的_privateGo。这可以作为一个hacky工作,但问题是你必须确保你总是有一个子类的实例,而不是超类,因为超类仍然不会派遣到C._privateGo(你'编辑源代码或获取新版本要好得多。

答案 1 :(得分:2)

不知道这对你来说是否有帮助

如果它是私有方法,则可能有一个调用该私有方法的公共方法。您可以尝试覆盖您班级中的公共方法。

答案 2 :(得分:1)

这是黑客行为方式:

私有方法适用于类中的某些公共方法。扩展类,重写该公共方法。保持一切相同,但从重写方法调用您自己的私有方法。

答案 3 :(得分:0)

私有方法不会被继承,也不能以任何方式覆盖。 以下主题可能对您有帮助......

1。 Overriding private methods in Java

2。 Confusing "override a private method"

3。 Can I override a private method in Java?

答案 4 :(得分:0)

GWT类的源代码随捆绑包一起提供。为什么不编辑源来解决问题?

答案 5 :(得分:0)

- 关于private methods要记住的最重要的之一是,它们不是内容。

- 因此可以说Sub-Class 对<{1}}中Private member的存在完全失明。因此很明显无法重写