最终变量值

时间:2017-11-06 07:33:36

标签: java string

我们说我们有一个不可变的类:

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;
  }
}

假设我们创建了最终变量,以便在创建对象后无法更改它们的值。此处尚未定义nameregNo的值。但我确实有一个问题。我们知道如果我们不为它们分配值,它将采用默认值。所以,如果我不指定任何值,它将是

name = null& regNo = 0

所以我的问题是,如果它已经被分配到默认值,我们如何在以后为它们分配值?这可能是一个菜鸟问题,但您的回复将受到高度赞赏。我无法在stackoverflow上找到一个正确的答案。

谢谢!

2 个答案:

答案 0 :(得分:1)

在初始化之前,这些值确实是null0

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。

无论你在创建新学生时给予什么,都将是最终的。