Java 使用已在构造函数中初始化的类的属性

Java 使用已在构造函数中初始化的类的属性,java,Java,如果我设置了一个类的属性值并使用final,我是否必须初始化该属性作为类构造函数的参数?例如,我已将属性rack of length设置为值60 public class Runs { Teams team; final int racklength=60; int xposteam; public Runs (Teams y) { team=y; } } final字段必须在内联或构造函数中初始化 例如:

如果我设置了一个类的属性值并使用final,我是否必须初始化该属性作为类构造函数的参数?例如,我已将属性rack of length设置为值60

public class Runs {
    Teams team;
    final int racklength=60;
    int xposteam;

     public Runs (Teams y) {
         team=y;           
     }
}

final
字段必须在内联或构造函数中初始化

例如:

class Foo {
    final String bar = "bar";
    Foo() {
    }
}


这是可以接受的

否,您可以在声明变量的位置初始化它。而且没有理由必须将带有参数的变量分配给构造函数。

不,您不必这样做

这两个都很好

public final class SomeClazz {
    private final int test=10;
    public SomeClazz(){

    }
    public int getTest() {
        return test;
    }

}


但是,我更喜欢通过构造函数初始化它们,因为这样构造对象的调用方知道如何使用预期值创建对象的状态。如果它应该是一个常量类型值,那么您应该使用
枚举
,而不是以这种方式在类中定义它们。

您必须始终初始化
final
属性,但您可以在适当的位置(首先声明它的位置)或在它的构造函数(或构造函数)中进行初始化:


您可以通过将代码块缩进4个空格来格式化代码(或者选择代码部分并单击编辑器中的{}按钮)。我这样做是为了你,但是你可能想编辑这个问题,并尝试修改一下格式。“而且没有理由你必须给构造函数分配一个带参数的变量。”-也许我看错了,但是。。。UH如果定义实例级常量(非静态final),则可以通过构造函数参数对其进行初始化。否则,如果一个类的所有实例的实例级常量都具有相同的值,那么我们最好将该常量设置为静态。我同意。你的观点与我所说的并不矛盾。你不需要一个获得者来做到这一点。@Jeremy Heiler-对。我的意思是将测试声明为
private
而不是默认的
包private
。我已经更新了我的帖子。你完全没有领会我的意思。为了使类/实例变量成为final.Aah,完全不需要声明getter-我只是重新阅读了文章中的第一行。我得到了它。谢谢
public final class SomeClazz {
    private final int test=10;
    public SomeClazz(){

    }
    public int getTest() {
        return test;
    }

}
public final class SomeClazz {
    private final int test;
    public SomeClazz(int test){
        this.test = test;
    }
    public int getTest() {
        return test;
    }

}
public class Runs {
    Teams team;
    final int racklength; // initialization postponed
    int xposteam;

     // constructor defaulting racklength to 60
     public Runs (Teams y){
         team=y;
         racklength=60;
    }

     // constructor with variable initialization of final attribute
     public Runs (int l, Teams y){
         team=y;
         racklength=l;
    }

     // error since racklength is not initialized during construction
     public Runs (){
         team=null
    }
}