Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不';我们不是一声明字段就初始化它们吗?_Java_Declaration - Fatal编程技术网

Java 为什么不';我们不是一声明字段就初始化它们吗?

Java 为什么不';我们不是一声明字段就初始化它们吗?,java,declaration,Java,Declaration,为什么不在类中声明字段后立即初始化它们呢?如果我们在声明字段后立即初始化了字段,那么代码的工作流是否会有所不同?关键是,为什么我们不在构造函数上方初始化它们?我们可以在声明字段时初始化它: class Foo { int a = 1; } 我们可以在构造函数中初始化字段: class Foo { int a; Foo() { a = 1; } } 我们甚至可以初始化初始化程序块中的字段: class Foo { int a; { a

为什么不在类中声明字段后立即初始化它们呢?如果我们在声明字段后立即初始化了字段,那么代码的工作流是否会有所不同?关键是,为什么我们不在构造函数上方初始化它们?

我们可以在声明字段时初始化它:

class Foo {
   int a = 1;
}
我们可以在构造函数中初始化字段:

class Foo {
   int a;

   Foo() {
     a = 1;
   }
}
我们甚至可以初始化初始化程序块中的字段:

class Foo {
   int a;

   {
     a = 1;
   }
}
实际上,编译器将第一个和第三个表单转换为第二个表单

(当然,如果字段不是
final
,我们也可以在方法中(重新)分配它)

如果您知道编写代码时需要的初始值
a
,并且它是一个简单的表达式,请务必以第一种方式编写它;一般来说,避免使用初始值设定项是值得的(主要是因为它不寻常,也不太好看)。如果您有多个构造函数,但希望在所有构造函数中设置相同的值,那么这种方法非常好:相同的初始化被复制到所有构造函数中(或者,至少是那些不调用
this(…)
的构造函数)

但是,如果需要基于构造函数参数之类的设置
a
,则必须使用(类似的)第二种方法:

class Foo {
   int a;

   Foo(int a) {
     this.a = a;
   }
}

您使用哪种方法取决于具体情况。

我们可以在声明字段时对其进行初始化:

class Foo {
   int a = 1;
}
我们可以在构造函数中初始化字段:

class Foo {
   int a;

   Foo() {
     a = 1;
   }
}
我们甚至可以初始化初始化程序块中的字段:

class Foo {
   int a;

   {
     a = 1;
   }
}
实际上,编译器将第一个和第三个表单转换为第二个表单

(当然,如果字段不是
final
,我们也可以在方法中(重新)分配它)

如果您知道编写代码时需要的初始值
a
,并且它是一个简单的表达式,请务必以第一种方式编写它;一般来说,避免使用初始值设定项是值得的(主要是因为它不寻常,也不太好看)。如果您有多个构造函数,但希望在所有构造函数中设置相同的值,那么这种方法非常好:相同的初始化被复制到所有构造函数中(或者,至少是那些不调用
this(…)
的构造函数)

但是,如果需要基于构造函数参数之类的设置
a
,则必须使用(类似的)第二种方法:

class Foo {
   int a;

   Foo(int a) {
     this.a = a;
   }
}
您使用哪种方法取决于具体情况。

首先:我们可以

为了得到更深入的回答,我将引用以下内容:

但是,由于其简单性,这种形式的初始化具有局限性。如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂数组),那么简单的赋值是不够的

因此,为了保持编写代码的一致性和一致性,以确保代码的可读性,我们倾向于避免直接初始化构造函数中的某些字段和其他字段(或其他地方)。

首先:我们可以

为了得到更深入的回答,我将引用以下内容:

但是,由于其简单性,这种形式的初始化具有局限性。如果初始化需要一些逻辑(例如,错误处理或for循环来填充复杂数组),那么简单的赋值是不够的


因此,为了保持编写代码的一致性和一致性,以确保代码的可读性,我们倾向于避免直接初始化构造函数中的某些字段和其他字段(或其他字段)。

我只初始化最终字段,其他所有字段都由构造函数初始化

class MyClass{
    final static int SERIAL = 12345678;

    int a, b, c, d;

    MyClass(int i){
        a = b = c = d = i;
    }

    MyClass(){
        this(1);
    }
}

我只初始化最后的字段,其他的都是由构造函数初始化的

class MyClass{
    final static int SERIAL = 12345678;

    int a, b, c, d;

    MyClass(int i){
        a = b = c = d = i;
    }

    MyClass(){
        this(1);
    }
}

谁说我们没有?或者你的意思是:我们为什么使用构造函数?想象一下,世界上到处都是人,名字和姓氏都一样。都有相同的性别,都有相同的眼睛颜色。。。有点无聊吧?这就是为什么我们在实际创建实例时只能为一个人设置实例变量的值,因为这些值链接到该实例,并且仅链接到该实例。我的意思是为什么我们不首先初始化构造函数上方的字段@StultuskePlease不要编辑不相关的和对话的内容,比如“我有一个问题已经在我脑子里想了一段时间”;这并没有增加任何问题(已编辑)。“如果我们在声明字段后立即初始化字段,那么代码的工作流程会有所不同吗?”构造函数体在字段初始化器之后执行,但除非您编写了一些非常糟糕的代码,否则这并不重要。@GamerTonz这正是我所解释的。因为所有实例的值都是相同的,而这不是您想要的。谁说我们不想要呢?或者你的意思是:我们为什么使用构造函数?想象一下,世界上到处都是人,名字和姓氏都一样。都有相同的性别,都有相同的眼睛颜色。。。有点无聊吧?这就是为什么我们在实际创建实例时只能为一个人设置实例变量的值,因为这些值链接到该实例,并且仅链接到该实例。我的意思是为什么我们不首先初始化构造函数上方的字段@StultuskePlease不要编辑不相关的和对话的内容,比如“我有一个问题已经在我脑子里想了一段时间”;这并没有增加任何问题(已编辑)。“如果我们在声明字段后立即初始化字段,那么代码的工作流程会有所不同吗?”构造函数体在字段初始化器之后执行,但除非您编写了一些非常糟糕的代码,否则这并不重要。@GamerTonz这正是我所解释的。因为所有实例的值都是相同的,而这不是您想要的。