当使用具有公共和私有字段和成员的类时,是否在编译时或运行时检查代码是否存在访问冲突(例如,尝试从外部类访问私有字段)?或两者?
问问题
4601 次
3 回答
4
两个都。如果您尝试编译试图访问不可访问的对象或方法的代码,您将收到编译时错误:
field has private access in package.Class
此外,当您的类尝试在运行时访问某些字段时,JVM 会检查访问:
Exception in thread "main" java.lang.IllegalAccessError: tried to access field package.Class.field from class YourClass
于 2012-12-29T00:31:36.723 回答
3
它在编译时被检查。我尝试了以下两个类:
class A {
private int i;
}
和
class B {
private void test() {
A a = new A();
a.i = 5;
}
}
当我尝试编译B.java
时,出现以下错误:
B.java:4: i has private access in A
a.i = 5;
^
1 error
但是,请记住,这个简单的示例仅适用于基本情况。当考虑反射时,这种行为可能会改变,即变量的名称仅在运行时确定。在这种情况下,无法在编译时检查访问修饰符,并且必须将检查推迟到运行时。
于 2012-12-29T00:28:23.703 回答
3
在这两种情况下。在编译时很容易看到。但是在运行时测试也不难。创建 2 个类
public class Test1 {
public static void main(String[] args) throws Exception {
Test2.hello();
}
}
public class Test2 {
static void hello() {
System.out.println("hello");
}
}
编译运行java Test1
,正常
现在将 Test2 更改为
priivate static void hello() {
System.out.println("hello");
}
并单独编译,使Test1.class不变。运行java Test1
。你会得到
Exception in thread "main" java.lang.IllegalAccessError: tried to access method Test2.hello()V from class Test1
at Test1.main(Test1.java:5)
于 2012-12-29T00:44:40.953 回答