我们说我们有一个不可变的类:
public final class Student
{
final String name;
final int regNo;
public Student(String name, int regNo)
{
this.name = name;
this.regNo = regNo;
}
public String getName()
{
return name;
}
public int getRegNo()
{
return regNo;
}
}
假设我们创建了最终变量,以便在创建对象后无法更改它们的值。此处尚未定义name
和regNo
的值。但我确实有一个问题。我们知道如果我们不为它们分配值,它将采用默认值。所以,如果我不指定任何值,它将是
name = null
& regNo = 0
所以我的问题是,如果它已经被分配到默认值,我们如何在以后为它们分配值?这可能是一个菜鸟问题,但您的回复将受到高度赞赏。我无法在stackoverflow上找到一个正确的答案。
谢谢!
答案 0 :(得分:1)
在初始化之前,这些值确实是null
和0
:
public static final class Student
{
final String name;
final int regNo;
public Student(String name, int regNo) throws NoSuchFieldException, IllegalAccessException {
System.out.println("BEFORE ASSIGNMENT:");
System.out.println(getName());
System.out.println(getRegNo());
this.name = name;
this.regNo = regNo;
System.out.println("AFTER ASSIGNMENT:");
System.out.println(getName());
System.out.println(getRegNo());
}
public String getName()
{
return name;
}
public int getRegNo()
{
return regNo;
}
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
new Student("Rahul", 3);
}
}
打印:
BEFORE ASSIGNMENT:
null
0
AFTER ASSIGNMENT:
Rahul
3
编译器只是不允许在初始化之前直接使用这些值。此外,它强制您在构造对象时分配它们一次(并且仅一次),并且之后不再重新分配它们。
答案 1 :(得分:0)
由于你没有任何默认构造函数(也没有任何其他构造函数而没有为最终变量赋值 - 如果你尝试的话会抛出编译错误) - 你不会成为能够实例化任何Student对象而不给出name和regNo。
无论你在创建新学生时给予什么,都将是最终的。