gpt4 book ai didi

java - 什么时候声明对象?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:27:37 24 4
gpt4 key购买 nike

我一直在从事我的一些 AP cs 项目,并想知道这样做之间的区别:

public class CalculateTaxes {
private Scanner in;

public CalculateTaxes(){
in = new Scanner(System.in);
}

还有这个:

public class CalculateTaxes {
private Scanner in = new Scanner(System.in);

public CalculateTaxes(){

}

我见过很多例子,他们在一行中声明一个对象,然后在代码的其他地方实例化它。为什么不在同一行中声明和实例化一个对象呢?

最佳答案

让我们测试如何编译这些类。

public class Test1 {
private Scanner in;

public Test1() {
in = new Scanner(System.in);
}
}

public class Test2 {
private Scanner in = new Scanner(System.in);

public Test2() {

}
}

如果我们使用 javap -c Test1 我们会看到

Compiled from "Test1.java"
public class Test1 {
public Test1();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: aload_0
5: new #12 // class java/util/Scanner
8: dup
9: getstatic #14 // Field java/lang/System.in:Ljava/io/InputStream;
12: invokespecial #19 // Method java/util/Scanner."<init>":(Ljava/io/InputStream;)V
15: putfield #22 // Field in:Ljava/util/Scanner;
18: return
}

如果我们在 Test2 上使用它,我们将得到

Compiled from "Test2.java"
public class Test2 {
public Test2();
Code:
0: aload_0
1: invokespecial #10 // Method java/lang/Object."<init>":()V
4: aload_0
5: new #12 // class java/util/Scanner
8: dup
9: getstatic #14 // Field java/lang/System.in:Ljava/io/InputStream;
12: invokespecial #19 // Method java/util/Scanner."<init>":(Ljava/io/InputStream;)V
15: putfield #22 // Field in:Ljava/util/Scanner;
18: return
}

正如您所见,Test2 类中 in 字段的初始化在构造函数开始时由编译器自动移动。

事实上,这段代码将在该类的每个构造函数的开头移动(如果有的话,就在 super() 调用之后)所以唯一的区别是,如果你的构造函数很少,你可以初始化 在构造函数之外的一个地方的字段中,而不是在每个构造函数中都这样做。

但是如果假设你想根据构造函数中传递的一些参数来初始化字段,那么你必须在构造函数 block 中进行。

关于java - 什么时候声明对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19454499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com