从本地方法抽象内部类扩展后,无法将内部类中的方法设置为私有

时间:2018-07-28 08:43:24

标签: java abstract-class inner-classes

我创建一个方法本地内部类,并与抽象类结合。代码可以正常工作,但是我不了解IntelliJ中的错误弹出窗口,因为我无法在从抽象内部类扩展为私有的内部类中设置Method。

我必须从“ Private InnerClassSubclass”更改为“ Public InnerClassSubclass”,如果我不这样做,将出现以下错误:

  InnerClassSubclass中的

'innerMethod()'与'innerMethod()'冲突   在“内部类”中;试图分配较弱的访问权限   ('私人的');是“公开”。

我以为私人是更强大的特权,不是吗?只允许访问同一班级中的班级。

我也尝试将'abstract class InnerClass'更改为'private abstract class InnerClass'也会收到此错误;

  

“私有抽象”中的“不允许在此处使用修饰符'私有'”   类InnerClass'

代码如下:

    public class Outerclass {

    // instance method of the outer class
    private void outer_Method() {
        int num = 23;

        // method-local inner class
        abstract class InnerClass {
            abstract public void innerMethod();
        } // end of inner class

        class InnerClassSubclass extends InnerClass {
            public void innerMethod() { //if I extends, I can't use private for innerMethod here.
                System.out.println("This is method inner class " + num);
            }
        }
        // Accessing the inner class
        new InnerClassSubclass().innerMethod();
    }

    public static void main(String args[]) {
        Outerclass outer = new Outerclass();
        outer.outer_Method();
        }
    }

有人可以告诉我为什么吗?谢谢。

3 个答案:

答案 0 :(得分:1)

  InnerClassSubclass中的

'innerMethod()'与'InnerClass'中的'innerMethod()'冲突;试图分配较弱的访问权限(“私有”);是“公开”。

这是正确的。您将始终能够写作

InnerClass ic = new InnerClassSubclass();
ic.innerMethod(); // method is public

考虑这种更普遍的情况。

static void callInnerMethod(InnerClass ic) {
    ic.innerMethod(); // method is public
}

在传递InnerClassSubclass时,不能使它引起编译错误。在更一般的情况下,您只能在运行时知道实际类型,因此在编译时无法解决。

InnerClass ic = Class.forName(someString).asSubClass(InnerClass.class).newInstance();

ic.innerMethod(); // this will compile as the method is public.

答案 1 :(得分:1)

您不能限制子类中方法的可见性。

假设Animal类具有公共方法“ breath()”。客户代码接收一个Animal对象并调用该方法。

现在假设您有一个Dog子类,并且您传递了一个小狗对象。客户代码应该如何知道他的特定动物不提供该方法?!

因此:限制方法的可见性在概念上是错误的,因此编译器会给您一个错误,恰恰说明了这一点。

答案 2 :(得分:0)

首先,您不能将方法设为私有,因为按照Java重写原则,子类不能使重写方法的访问修饰符比其父类中的修饰符更紧密。在这里,由于父类将access修饰符设置为public,因此也应在子类中将其公开。

第二,内部类只能具有两个访问修饰符:abstract和final。您不能将其声明为私有