当前位置: 首页 > 知识库问答 >
问题:

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

慎懿轩
2023-03-14

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

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

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

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

我还尝试将'abstract class InnerClass'更改为'private abstract class InnerClass'也出现了这个错误;

“private抽象类InnerClass”的private处“此处不允许使用修饰符'private'”

代码如下:

    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个答案

唐弘和
2023-03-14

首先,您不能使方法私有,因为根据java重写原则,子类不能使重写方法的访问修饰符比其父类中的更紧。在这里,因为父类的访问修饰符为public,所以它也应该在子类中公开

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

仉梓
2023-03-14

“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.
昝枫
2023-03-14

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

假设一个动物类有一个公共方法“呼吸()。客户端代码接收动物对象并调用该方法。

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

因此:限制方法的可见性在概念上是错误的,因此编译器会给你一个错误,准确地说就是这样。

 类似资料:
  • 问题内容: 是否可以将扩展方法添加到python内置类型中?我知道我可以通过简单地通过添加新方法来将扩展方法添加到定义的类型。如下: 但是是将扩展方法添加到python内置类型(如列表,字典,…)的任何方法 问题答案: 可以使用以下非常聪明的模块在纯Python中完成此操作: https://pypi.python.org/pypi/forbiddenfruit 例如: 在那里,感觉不舒服吗?

  • 问题内容: 有什么方法可以访问Java中的本地内部类的方法。以下代码是我之前尝试过的示例代码。据此,访问该方法的机制是什么? 问题答案: 正如ILikeTau的评论所说,您无法访问在方法中定义的类。您可以在方法之外定义它,但是另一种可能性是定义一个(或抽象类)。这样,代码仍将位于您的方法内部,并且可以访问该方法中定义的变量和参数(如果将整个类移到外面,则无法执行此操作)。就像是: 注意: 未测试

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 问题内容: 在下面显示的代码片段中,内部类本身继承了外部类。 方法中的唯一语句(最后一个片段)将值分配给类的私有字段,然后调用该方法。 该方法会导致另一个字符串- 要设置的私人领域中的类调用之前的方法延长。 因此,方法中的以下两个语句: 应该显示 另一个价值 另一个价值 但是他们显示 初始值 初始值 为什么会这样? 问题答案: 方法和领域都是。因此,其他子类(包括子类)均无法访问它们。它们不是继承

  • 问题内容: 我想这样做,但我不能。这是我的情况和理性。我有一个用于测试用例的抽象类,该类具有一个称为test()的抽象方法。test()方法由子类定义;它应使用特定应用程序的逻辑来实现,例如。我不希望直接调用test()方法,我希望超类调用test()方法,而子类可以调用调用此方法的方法(并且还可以进行其他工作,例如设置当前例如在执行测试之前的日期时间)。示例代码: 然后扩展这个。 然后调用它。

  • 我在使用reflections api的公共类中的私有类中使用私有方法时遇到问题。下面是一个简化的代码示例: 同样,我希望能够实例化一个类对象,然后从私有类调用。我一直试图通过反射来做到这一点,但我似乎无法超过1级。此外,内部类可能有也可能没有大多数代码似乎使用的构造函数。上面的代码只是框架。 我当前的代码: 我查找了各种方法来获取内部类或私有方法,但找不到在不使用构造函数的情况下将外部对象获取到