Java:重写私有函数

Java:重写私有函数,java,inheritance,Java,Inheritance,我们在Tree类中发现了一个GWT bug(由Google修复,但在更新的版本中)。需要修复的函数是私有函数。我想知道是否有任何方法可以覆盖私有函数。如果需要的话,它可以是黑客的,但如果有办法,请一定让我知道 我可能会尝试找出如何更改GWT代码并将其作为另一个选项重新编译,但如果我可以派生一个类(“MyTree”)并以某种方式重写此功能,则会更加容易。无法重写私有函数。基本上,它们不存在于子类型中 它们也不能在超类分派到子类重写的意义上被重写 一个具体的例子可能很有用: public class

我们在Tree类中发现了一个GWT bug(由Google修复,但在更新的版本中)。需要修复的函数是私有函数。我想知道是否有任何方法可以覆盖私有函数。如果需要的话,它可以是黑客的,但如果有办法,请一定让我知道


我可能会尝试找出如何更改GWT代码并将其作为另一个选项重新编译,但如果我可以派生一个类(“MyTree”)并以某种方式重写此功能,则会更加容易。

无法重写私有函数。基本上,它们不存在于子类型中

它们也不能在超类分派到子类重写的意义上被重写

一个具体的例子可能很有用:

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。这可以作为一个黑客的解决办法,但问题是你必须确保你总是有子类的实例,而不是超类,因为超类仍然不会发送到C._privateGo(你最好编辑源代码或获取新版本).

不知道这是否对你有帮助


如果它是一个私有方法,那么可能有一个调用该私有方法的公共方法。您可以尝试在类中重写该公共方法

私有方法不是继承的,不能以任何方式重写。 以下线程可能会帮助您

一,

二,


三,

GWT类的源代码随包提供。为什么不编辑源代码来修复问题?

以下是黑客攻击方式:


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

-关于
私有方法
最重要的一点是,它们不是继承的。


-因此可以说,
子类
超类
中的
私有成员的存在完全视而不见。所以很明显,它不能被重写

,如果它是私有的,就不应该被重写。简单的回答是:不要尝试这样做。找到另一种方法来实现你想要的功能。据我所知,没有办法覆盖它来应用于基类。如果您有源代码,可以在基类中将其设置为受保护的或公共的。不过,这两个链接对于读取包中可能重复的其他类可能会调用原始类可能很有用。因此,要使其工作,您还必须扩展并覆盖这些其他类。然后其他类也可以称这些类。完成后,你基本上重写了整个包。当新版本的软件包问世时,这是一个有趣的时刻。