为什么这会产生编译时错误而不是运行时错误?

时间:2016-02-01 22:15:19

标签: java

考虑这个简单的类:

public class MyClass3
{
  private int a;

  public MyClass3(int first)
  {
    this.a = first;
  }
}

public class MyClassTester
{
  public static void main(String[] args)
  {
    MyClass3 c1 = new MyClass3(30);
    System.out.println(c1.a);
  }
}

2 个答案:

答案 0 :(得分:5)

编译器能够告诉您在声明类之外访问私有变量的尝试无效。您不必通过运行时来获得它。

作为附录:代码在语义上无效,per the JLS

  
      
  • 只有在类型可访问且声明成员或构造函数允许访问时,才能访问引用类型的成员(类,接口,字段或方法)或类类型的构造函数:      
        
    • [...]否则,成员或构造函数被声明为私有,并且允许访问当且仅当它出现在顶级类的主体中(第7.6节)时才包含成员或构造函数的声明。
    •   
  •   

如果你想要访问它,传统上你会使用getter ...

public int getA() {
    return a;
}

...但如果您不想制作其他方法(无论出于何种原因),请将其可见性更改为public

答案 1 :(得分:0)

因为考虑到问题的本质,编译器甚至无法生成运行程序的代码