簡體   English   中英

無法為最終變量“名稱”分配值

[英]Cannot assign a value to final variable 'name'

Java為什么不允許我間接初始化最終變量? 我不明白為什么它不起作用,我的意思是該方法將始終運行,因此,如果直接或通過方法進行初始化有什么不同?

此代碼有效:

package com.company;

public class Person {

    private final String name;

    public Person() {
        name = "bob";
    }
}

這不是。 (即使我擺脫了IO代碼並硬編碼分配給name的值)

package com.company;

import java.util.Scanner;

public class Person {

    private final String name;

    public Person() {
        askName();
    }

    public void askName() {
        Scanner scanner = new Scanner(System.in);
        name = scanner.nextLine();
    }
}

您只能在4個地方為最終成員變量賦值:

  1. 在申報時

  2. 在構造函數中

  3. 在靜態初始化塊中(如果變量為靜態)

  4. 在初始化塊中(如果變量不是靜態的)

這是常識。 您只能初始化一次最終變量。

構造函數只能被調用一次,因此,除非變量是靜態的,否則可以在此處對其進行初始化。

但是您的方法可以無限次調用,這將導致重新引用變量,這正是final關鍵字應避免發生的事情。

final字段必須在構造函數中設置。 您可以執行以下操作。

import java.util.Scanner;

public class Person {

    private final String name;

    public Person() {
        name = askName();
    }

    public static String askName() {
        Scanner scanner = new Scanner(System.in);
        return scanner.nextLine();
    }
}

但是,更好的選擇可能會注入您所需的價值。

import java.util.Scanner;

public class Person {

    private final String name;

    public Person(String name) {
        this.name = name;
    }

    public static Person askName() {
        Scanner scanner = new Scanner(System.in);
        return new Person(scanner.nextLine());
    }
}

您可以在4個地方初始化最終變量。

  • 有聲明
  • 在構造函數中(僅非靜態)
  • 在靜態初始值設定項中(僅適用於靜態)
  • 在實例初始化程序中(僅非靜態)

靜態最終變量

這些變量可以在聲明或靜態初始化程序中初始化。

class Program {
    static final int i1 = 10;
    static final int i2;
    static {
        i2 = 10;
    }
}

最終變量

最終變量可以在聲明,實例初始化器或構造函數中初始化:

class Program {
    final int i1 = 10;
    final int i2;
    final int i3;
    {
        i2 = 10;
    }

    Program() {
        i3 = 10;
    }
}

局部最終變量

這些變量可以在聲明中或聲明之后的任何地方初始化。 局部最終變量必須在使用之前進行初始化。

class Program {
    void method() {
         final int i1 = 10;
         final int i2;
         System.out.println(i1);
         i2 = 10;
         System.out.println(i2);
         return ;
    }
}

這是因為最終變量無法在方法中初始化。 它需要在構造函數中初始化,而僅聲明或僅在靜態塊中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM