📜  Java中的实例变量作为final

📅  最后修改于: 2022-05-13 01:55:35.530000             🧑  作者: Mango

Java中的实例变量作为final

实例变量:众所周知,当变量的值因对象而异时,这种类型的变量称为实例变量。实例变量是在类中声明的,但不在任何方法、构造函数、块等中。如果我们不初始化实例变量,那么 JVM 会根据该实例变量的数据类型自动提供默认值。
但是如果我们将实例变量声明为final ,那么我们必须要注意实例变量的行为。

  • 没有要求将变量设为最终变量。但是,当您确实明确打算永远不更改变量时,最好将其设为 final
  • 在创建不可变类时,我们必须使用实例变量作为最终变量。

关于最终实例变量的要点:

  1. 变量初始化强制:如果实例变量声明为final,那么无论我们是否使用它,我们都必须显式地执行初始化,并且JVM不会为final实例变量提供任何默认值。
    // Java program to illustrate the behavior 
    // of final instance variable
    class Test {
        final int x;
        public static void main(String[] args)
        {
            Test t = new Test();
            System.out.println(t.x);
        }
    }
    

    输出:

    error: variable x not initialized in the default constructor
    
  2. 构造函数完成前的初始化:对于最终实例变量,我们必须在构造函数完成之前执行初始化。我们可以在声明的时候初始化一个最终的实例变量。
    // Java program to illustrate that 
    // final instance variable
    // should be declared at the 
    // time of declaration
    class Test {
        final int x = 10;
        public static void main(String[] args)
        {
            Test t = new Test();
            System.out.println(t.x);
        }
    }
    

    输出:

    10
    
  3. 在非静态或实例块内初始化:我们也可以在非静态或实例块内初始化最终实例变量。
    // Java program to illustrate 
    // that final instance variable
    // can be initialize within instance block
    class Test {
        final int x;
        {
            x = 10;
        }
        public static void main(String[] args)
        {
            Test t = new Test();
            System.out.println(t.x);
        }
    }
    

    输出:

    10
    
  4. 默认构造函数中的初始化:在默认构造函数中,我们还可以初始化最终实例变量。
    // Java program to illustrate that 
    // final instance variable
    // can be initialized 
    // in the default constructor
    class Test {
        final int x;
        Test()
        {
            x = 10;
        }
        public static void main(String[] args)
        {
            Test t = new Test();
            System.out.println(t.x);
        }
    }
    

    输出:

    10
    

上面提到的是对最终实例变量执行初始化的唯一可能的地方。如果我们尝试在其他任何地方执行初始化,那么我们将得到编译时错误。

// Java program to illustrate 
// that we cant declare
// final instance variable 
// within any static blocks
class Test {
    final int x;
    public static void main(String[] args)
    {
        x = 10;
        Test t = new Test();
        System.out.println(t.x);
    }
}

输出:

error: non-static variable x cannot be referenced from a static context
// Java program to illustrate that we
//  cant declare or initialize
// final instance variable within any methods
class Test {
    final int x;
    public void m()
    {
        x = 10;
    }
}

输出:

error: cannot assign a value to final variable x