在构造函数内部和外部设置字段有区别吗?

2023-11-23

public class Test {
    int value = 100;
    public Test() {

    }
}

And

public class Test {
    int value;
    public Test() {
        value = 100;
    }
}

是等价的,对吗?有什么理由让我更愿意做其中一个而不是另一个?显然,如果构造函数采用稍后赋予字段的参数是一个原因:

public class Test {
    int value;
    public Test(int value) {
        this.value = value;
    }
}

或者也许我需要做一些特殊的计算。

但如果我don't这样做,还有其他充分的理由吗?


好吧,这实际上取决于您计划如何使用它。我假设你不打算做value静态的,但它只是出于内部目的。

首先让我们看一下字节码。

D:\eclipse\workspace\asdf\bin>javap -c A.class
Compiled from "A.java"
public class A {
  int value;

  public A();
    Code:
       0: aload_0
       1: invokespecial #10                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: bipush        100
       7: putfield      #12                 // Field value:I
      10: return
}

D:\eclipse\workspace\asdf\bin>javap -c B.class
Compiled from "B.java"
public class B {
  int value;

  public B();
    Code:
       0: aload_0
       1: invokespecial #10                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: bipush        100
       7: putfield      #12                 // Field value:I
      10: return
}

D:\eclipse\workspace\asdf\bin>

你猜怎么了?一模一样!为什么?因为在使用以下方法创建对象之前,您无法使用值new关键词。

The 甲骨文文档指出:

正如您所看到的,您通常可以为字段提供初始值 在其声明中:

public class BedAndBreakfast {
    // initialize to 10
    public static int capacity = 10;

    // initialize to false
    private boolean full = false;
} 

当初始化值可用并且可以进行初始化时,这很有效 一条线。然而,这种形式的初始化有局限性,因为 其简单性。如果初始化需要一些逻辑(例如, 错误处理或 for 循环来填充复杂数组),简单 分配不充分。实例变量可以在 构造函数,可以在其中使用错误处理或其他逻辑。到 为类变量提供相同的功能,Java 编程 语言包括静态初始化块。

所以现在您已经确认在构造函数中执行此操作的全部目的是如果您正在执行一些复杂的操作(例如初始化数组),否则在声明字段时可以随意执行此操作。

如果你要使用static那么你显然在做两件不同的事情。这几乎就像检查某人是否曾经创建过该对象的实例。你的变量是0直到有人创建一个对象,然后它就会是100之后。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在构造函数内部和外部设置字段有区别吗? 的相关文章

随机推荐