我创建一个方法本地内部类,并与抽象类结合。代码可以正常工作,但是我不了解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();
}
}
有人可以告诉我为什么吗?谢谢。
答案 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。您不能将其声明为私有