Java:无法访问外部类的子类中嵌套类子类的受保护方法

时间:2019-02-18 15:48:19

标签: java inner-classes protected

我正在分解一个类以允许重用,不同的信息隐藏实现等。

是:

public class Outer
{
    public static class Inner
    {
        // ...
        protected static void innerDoSomething()
        {
            // ...
        }
    }

    public outerDoSomething()
    {
        //...   
        Inner.innerDoSomething();
        //...
    }
}

一切都很好,因为外部的Outer类被允许访问嵌套的Inner类的受保护成员。

但是尝试分解:

public class SuperOuter
{
    public static class SuperInner
    {
        // ...
        protected static void innerDoSomething()
        {
            // ...
        }
    }

    // ...
}

public class SubOuter extends SuperOuter
{
    public static class SubInner extends SuperInner
    {
        // ...
        protected static void innerDoSomethingElse()
        {
            // ...
        }
    }

    public outerDoSomething()
    {
        //...   
        SubInner.innerDoSomethingElse(); // OK
        SubInner.innerDoSomething();     // Error: cannnot access!
        //...
    }
}

innerDoSomething()不可访问,即使SubOuter可以访问SubInner的受保护成员,并且SuperInner的所有受保护成员也应该是SubInner受保护接口的一部分。

使其生效的唯一方法似乎是为每种方法添加显式委派,例如:

    public static class SubInner extends SuperInner
    {
        // ...
        protected static void innerDoSomethingElse()
        {
            // ...
        }

        protected static void innerDoSomething()
        {
            SuperInner.innerDoSomething();
        }
    }

这很烦人,容易出错并且浪费时间。我很想只将innerDoSomething()声明为公共对象,但这并不是真的正确,因为它只能由SubOuter及其子类使用。

为什么? SubOuter是否应该禁止并保护innerDoSomething()保护的访问权限?

1 个答案:

答案 0 :(得分:1)

不能通过变量引用从其他程序包访问受保护的方法。 如果SuperOuter和SubOuter这两个类位于同一程序包中,它将起作用。