Java class 中构造函数可以访问哪些变量?

Which variables constructor can access in Java class?

我正在研究 Java (OOP) 中的构造函数,但无法弄清楚构造函数可以访问什么类型的变量?构造函数可以访问以下哪些变量?

  1. 任意方法定义的局部变量
  2. 私有实例变量
  3. 一个public实例变量
  4. 静态变量

我创建了以下示例来详细说明我的问题:

public class constructorAccess {
    public int marks; // 3. Public instance variable
    private String firstName; // 2. Private instance variable
    static final String LASTNAME = "Smith"; // 4. Static variable

    public static void studentId(){
        int id; // 1. Local variable inside method
        id = 5;
        System.out.println(id);
    }

    public constructorAccess(int marks, String firstName) {
        this.marks = marks;
        this.firstName = firstName;
    }
}

是否可以从 constructorAccess 访问 id(1. studentId 方法中声明的局部变量)和 LASTNAME(4. class 中声明的静态变量)?

public constructorAccess(int marks, String firstName) {
   this.marks = marks;
   this.firstName = firstName;
   // How can I use id variable here from studentId method?
   // How can I use LASTNAME static variable here?
}

我用它访问了私有和 public 实例变量。参考,但 LASTNAMEid 变量给我错误(创建局部变量)。

局部变量只能由声明局部变量的范围内的代码访问(即 {...} 对)。从方法外部访问它们是没有意义的,因为局部变量的存在与特定方法相关call:当方法当前未被执行时,其局部变量根本不存在;如果该方法递归调用自身或从多个线程执行,则每个方法调用都有自己独立的局部变量集。

关于您的其他三个问题:是的,如果构造函数(和方法)在同一个 class 中声明,则它们始终可以访问任何实例和静态变量。如果它们在不同的 classes 中,那么更复杂的 access rules 进来玩。

如果您在分配给 LASTNAME 的示例中收到错误,那是因为您将它声明为 final,这意味着变量只能被分配一次,因为它的值已经已分配,您不能再次分配给它。但它仍然是 "accessible" 因为你可以 读取 它的值。或者将其设为 staticfinal,然后您既可以读取又可以分配给它。