在从本地方法抽象内部 class 扩展后,无法将内部 class 中的方法设置为私有
Cannot set method in inner class as private after extends from local method abstract inner class
我创建了一个本地方法 Class 并与抽象 class 相结合。代码工作正常,但我不明白 IntelliJ 中关于我无法设置从抽象内部 class 扩展为私有的内部 class 中的方法的错误弹出窗口。
我必须从 "Private InnerClassSubclass" 更改为 "Public InnerClassSubclass",如果我不这样做,错误如下:
'innerMethod()' in 'InnerClassSubclass' clashes with 'innerMethod()'
in 'InnerClass'; attempting to assign weaker access privileges
('private'); was 'public'.
我以为私有是更强的特权,不是吗?只允许同一class内的class访问。
我也尝试将 'abstract class InnerClass'
更改为 'private abstract class InnerClass'
也出现了这个错误;
"Modifier 'private' not allowed here" at private of 'private abstract
class 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 重写原则,子 class 不能使重写方法的访问修饰符比其父 class 中的访问修饰符更严格。在这里,因为父 class 的访问修饰符为 public,因此子 class 中也应设为 public
其次,内部class只能有两个访问修饰符:abstract和final。您不能将其声明为私有
'innerMethod()' in 'InnerClassSubclass' clashes with 'innerMethod()' in 'InnerClass'; attempting to assign weaker access privileges ('private'); was 'public'.
这是正确的。你总能写
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.
您不能限制子方法中方法的可见性class。
假设动物 class 有一个 public 方法 "breath()"。客户端代码接收一个 Animal 对象并调用该方法。
现在假设您有一个 Dog subclass,并且您传递了一个 doggy 对象。客户端代码如何知道他的特定 Animal 不提供该方法?!
因此:限制方法的可见性在概念上是错误的,因此编译器给你一个错误,正是这样说的。
我创建了一个本地方法 Class 并与抽象 class 相结合。代码工作正常,但我不明白 IntelliJ 中关于我无法设置从抽象内部 class 扩展为私有的内部 class 中的方法的错误弹出窗口。
我必须从 "Private InnerClassSubclass" 更改为 "Public InnerClassSubclass",如果我不这样做,错误如下:
'innerMethod()' in 'InnerClassSubclass' clashes with 'innerMethod()' in 'InnerClass'; attempting to assign weaker access privileges ('private'); was 'public'.
我以为私有是更强的特权,不是吗?只允许同一class内的class访问。
我也尝试将 'abstract class InnerClass'
更改为 'private abstract class InnerClass'
也出现了这个错误;
"Modifier 'private' not allowed here" at private of 'private abstract class 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 重写原则,子 class 不能使重写方法的访问修饰符比其父 class 中的访问修饰符更严格。在这里,因为父 class 的访问修饰符为 public,因此子 class 中也应设为 public
其次,内部class只能有两个访问修饰符:abstract和final。您不能将其声明为私有
'innerMethod()' in 'InnerClassSubclass' clashes with 'innerMethod()' in 'InnerClass'; attempting to assign weaker access privileges ('private'); was 'public'.
这是正确的。你总能写
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.
您不能限制子方法中方法的可见性class。
假设动物 class 有一个 public 方法 "breath()"。客户端代码接收一个 Animal 对象并调用该方法。
现在假设您有一个 Dog subclass,并且您传递了一个 doggy 对象。客户端代码如何知道他的特定 Animal 不提供该方法?!
因此:限制方法的可见性在概念上是错误的,因此编译器给你一个错误,正是这样说的。