【问题标题】:Variable binds to the object without having custom constructor?变量绑定到对象而没有自定义构造函数?
【发布时间】:2020-05-25 05:40:52
【问题描述】:

我对此感到困惑。这就是我的意思:

public class minMax {

    private int min = Integer.MAX_VALUE;

    public void changeMin() {
        min = 10;
    }

    public static void main (String args[]) {
        minMax ob1 = new minMax();
        ob1.changeMin();
        System.out.println(ob1.min); // outputs 10 <<<<
    }
}

所以它输出 10,即使我们没有明确地将 min 变量绑定到 minMax 构造函数。我认为您必须有一个构造函数来使用变量初始化对象才能使其工作。例如:

    private int min;

    public minMax() {
        min = Integer.MAX_VALUE;
    }

我错过了什么?希望能给个解释,谢谢!

编辑:

为了进一步说明我的观点,我们为什么需要执行以下操作:

private int min;

public minMax() {
    min = Integer.MAX_VALUE;
}

而不是将其保留为默认构造函数,而只是:

private int min = Integer.MAX_VALUE;

public minMax() {
}

【问题讨论】:

  • 您是否在问为什么变量min 包含您通过显式调用changeMin() 方法实际分配给它的值?我认为问题在于Integer.MAX_VALUE 在构造函数或其他代码块之外分配给min。你能澄清一下令人困惑的部分吗?
  • 为该类的该实例更改变量(对于特定对象)。在我们的类中,我们总是在类的构造函数中初始化变量,所以我认为这就是绑定它们的原因。所以我有点困惑,如果我们不需要在构造函数中初始化它,那为什么要这样做呢?我将在我的问题中提供一些代码来说明它。一秒。

标签: java object constructor


【解决方案1】:

更改实例变量(例如您的min 变量)的状态(即值)不必在构造函数中进行。它可以在任何可以访问这些变量的方法中发生,例如您的 changeMin() 方法。

编辑:您的编辑使问题与changeMin() 方法无关。现在是关于构造函数中实例变量的初始化与实例变量初始化器中的初始化。两者都是初始化实例变量的有效方法。但是,构造函数中的初始化更强大,因为它允许您将实例变量的值设置为传递给构造函数的值(作为构造函数参数)。

【讨论】:

  • 嗨,Eran,感谢您的回复。好吧,如果我们不必在构造函数中实际更改实例变量的值,那么在什么情况下我们需要在构造函数中进行呢?在我们的课程中,我们必须始终在构造函数中初始化变量,所以我一直认为这是必须的。
  • @EliS。在构造函数中,您通常将实例变量的状态初始化为一些初始值,这些初始值使对象进入使对象可用的某些有效状态。如果该对象是不可变的,则只能在构造函数中设置实例变量的值。但是如果对象是可变的,你通常会有改变实例变量值的方法。
  • 但是,即使对象是不可变的,难道你不能像上面我的对象所示,初始化使对象在构造函数之外可用的初始值吗?我编辑了我的问题来说明我的例子
  • 您的编辑澄清并回答了我的困惑。谢谢。
【解决方案2】:

以下是java中类变量初始化的可能性:

动态初始化,我们称之为默认值

  • 如果有多个构造函数,您不必重复初始化
  • 易于阅读和理解变量的实例化方式和位置
private int min = Integer.MAX_VALUE;

在构造函数中初始化

  • 如果不同构造函数中的变量值不同,则应该使用构造函数初始化
  • 我首选的声明变量的方式,构造函数的使用方式与设计方式相同
private int min;

public minMax() {
    this.min = Integer.MAX_VALUE;
}

public minMax(int min) {
    this.min = min;
}

静态块

  • 复杂的基于类的初始化
  • 在加载类之后和创建任何类实例之前
private static int min;

static {
    min = Integer.MAX_VALUE;
}

【讨论】:

    【解决方案3】:

    您正在调用 minMax 类的主要方法。 在公共changeMin() 方法中,您将10 分配给私有min 变量。changeMin() 可以访问私有min,因为它是从同一类调用的

    该私有变量可以从它被初始化的同一个类中访问。 如果您在另一个类中有 main 方法并尝试复制此场景 你会得到Error:(15, 31) java: min has private access in minMax

    这意味着如果 changeMin() 方法从其他类调用私有 min 变量,那么这将是一个编译错误

    阅读this 以更好地了解访问修饰符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多