【问题标题】:Cannot set method in inner class as private after extends from local method abstract inner class从本地方法抽象内部类扩展后,无法将内部类中的方法设置为私有
【发布时间】:2019-01-05 06:24:50
【问题描述】:

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

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

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

我认为私有是更强的特权,不是吗?只允许同一类内的类访问。

我也尝试将'abstract class InnerClass'更改为'private abstract class InnerClass'也出现此错误;

“此处不允许使用修饰符 'private'”在 private of 'private abstract 类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();
        }
    }

有人能解释一下为什么吗?谢谢。

【问题讨论】:

标签: java abstract-class inner-classes


【解决方案1】:

首先,您不能将方法设为私有,因为根据 java 覆盖原则,子类不能使覆盖方法的访问修饰符比其父类中的访问修饰符更严格。这里,因为父类的访问修饰符是public,所以子类也应该是public的

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

【讨论】:

  • 你能推荐一本书或任何关于Java背景的链接,我可以提高我的知识吗?我觉得我对 Java 的基础知识很薄弱 :( 谢谢。
  • 我会告诉你我读到的内容。 JAVA The Complete Reference by Herbert Schildt。提前了解 Kathy Sierra 的 OCP Java SE 8 Programmer
【解决方案2】:

“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.

【讨论】:

    【解决方案3】:

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

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

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

    因此:限制方法的可见性在概念上是错误的,因此编译器会给你一个错误,正是如此。

    【讨论】:

    • 所以,子类方法只能是公共的。我会记住的,谢谢。
    • 没有。子类方法可见性不能*less。如果基本方法是受保护的,你可以把它变成公共的。
    猜你喜欢
    • 2015-09-28
    • 2015-06-19
    • 2021-11-20
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多