我有两个类。
类 A
有一个受保护的方法 m()
,a
是 A
类的一个实例。
类 B
与类 A
在同一个包中。
我试图访问 a.m()
,但是出现了 IllegalAccessError
...
问题出在哪里?
我有两个类。
类 A
有一个受保护的方法 m()
,a
是 A
类的一个实例。
类 B
与类 A
在同一个包中。
我试图访问 a.m()
,但是出现了 IllegalAccessError
...
问题出在哪里?
在运行时,类或接口的确定不仅仅取决于其名称,还取决于一对:其完全限定名和定义该类的类加载器。每个这样的类或接口都属于单个运行时包。类或接口的运行时包是由该类或接口的包名称和定义该类或接口的类加载器确定的。
并且在第5.4.4节中提到:如果以下任何条件成立,则字段或方法R对类或接口D可访问:
...
R既可以是受保护的,也可以是程序包私有的(即既不是公共的、受保护的,也不是私有的),并且是由与D相同的运行时包中的类声明的。
它必须正常工作,看下面的例子就可以了:
package com.stackoverflow;
public class TEST
{
static class A {
protected void m()
{
System.out.println("hello from A.m()");
}
}
static class B {
public B()
{
a.m();
}
private A a = new A();
}
/**
* @param args
*/
public static void main(String[] args)
{
B b = new B();
}
}
这段代码会输出以下信息: "hello from A.m()
"
"protected修饰符指定该成员只能在其自己的包内访问(与包私有相同),并且可以被另一个包中其类的子类访问。"
请参见控制类成员的访问权限。
编译器应该能捕获到这种错误。如果你在运行时遇到了这个问题,说明出现了一些错误。很可能是你改变了完全重新编译的源代码。
它必须能正常工作。这里有一个运行的示例 -
**
**
package com.test;
public class A {
protected void m(){
System.out.println("Hi Stackoverflow");
}
}
**
**
package com.test;
public class B{
public static void main(String[] args) {
A a = new A();
a.m();
}
}
打印出期望的字符串
你好 Stackoverflow