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

Posted

技术标签:

【中文标题】Java 类中的哪些变量构造函数可以访问?【英文标题】:Which variables constructor can access in Java class? 【发布时间】:2016-02-20 23:19:30 【问题描述】:

我正在研究 Java (OOP) 中的构造函数,但不知道构造函数可以访问什么类型的变量?下列哪些变量可以被构造函数访问?

    任何方法定义的局部变量 私有实例变量 公共实例变量 一个静态变量

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

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.类中声明的静态变量)?

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?

我用这个访问了私有和公共实例变量。引用,但 LASTNAMEid 变量给我错误(创建一个局部变量)。

【问题讨论】:

我认为您应该尝试编写一个构造函数,看看是否可以在其中使用这些变量。 作用域是作用域,构造函数只是另一种方法,没有特殊作用域 你的问题没有意义。如果静态变量和实例变量不能被构造函数访问,和/或它不能有局部变量,那么很难看出构造函数的实际用途,你不觉得吗?你真的考虑过吗? @EJP 感谢您的评论。这意味着,构造函数可以访问提到的所有四个变量。我之前对任何方法定义的局部变量都有疑问。 @JarrodRoberson 我修改了问题。 【参考方案1】:

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

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

如果您在分配给LASTNAME 的示例中收到错误,那是因为您将其声明为final,这意味着该变量只能分配一次,并且由于它的值已经分配,​​您不能再次分配给它。但它仍然是“可访问的”,因为您可以读取它的值。或者将它设为staticfinal,然后你就可以读取并分配给它。

【讨论】:

以上是关于Java 类中的哪些变量构造函数可以访问?的主要内容,如果未能解决你的问题,请参考以下文章

实体类中构造函数的疑问

如何限制开发人员使用反射访问Java中的私有方法和构造函数?

java类中,成员变量赋值第一个进行,其次是静态构造函数,再次是构造函数

带参数的Java私有构造函数[重复]

Java——变量

JAVA-初步认识-第九章-继承-子父类中的构造函数-子类的实例化过程-细节