Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法为最终变量“name”赋值_Java_Intellij Idea - Fatal编程技术网

Java 无法为最终变量“name”赋值

Java 无法为最终变量“name”赋值,java,intellij-idea,Java,Intellij Idea,为什么Java不允许我间接初始化最终变量?我不明白为什么它不应该工作,我的意思是该方法将始终运行,所以如果直接初始化或通过该方法初始化,会有什么区别 此代码适用于: package com.company; public class Person { private final String name; public Person() { name = "bob"; } } 这个没有。即使我去掉了IO代码,并对分配给name的值进行了硬编码 pac

为什么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个位置为最终成员变量赋值:

在申报时

在构造函数中

在静态初始化块中,如果变量是静态的

在初始化块中,如果变量不是静态的


只能在4个位置为最终成员变量赋值:

在申报时

在构造函数中

在静态初始化块中,如果变量是静态的

在初始化块中,如果变量不是静态的


您可以在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 ;
    }
}

您可以在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 ;
    }
}

这是因为最终变量不能在方法中初始化。它需要在构造函数中初始化,而只声明或只在静态块中初始化。

这是因为最终变量不能在方法中初始化。它需要在构造函数中初始化,同时只声明或只在静态块中声明。

这是常识。只能初始化最终变量一次

构造函数只能调用一次,因此,除非变量是静态的,否则可以在这里初始化它


但是您的方法可以被无限次调用,这将导致变量被重新引用,这正是final关键字应该避免的情况。

这是常识。只能初始化最终变量一次

构造函数只能调用一次,因此,除非变量是静态的,否则可以在这里初始化它

但是您的方法可以被无限次调用,这将导致变量被重新引用,这正是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());
    }
}
必须在构造函数中设置最终字段。你可以做以下几点

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

最终手段,你不能分配给它,除非在构造函数中或在声明点。可能重复的最终手段,你不能分配给它,除非在构造函数中或在声明点。可能的重复实际上是有意义的。如果能够将构造函数中的长代码段封装到函数中会很好,但这是函数的唯一目的。这实际上是有意义的。能够将构造函数中的长代码段封装到函数中会很好,但这是函数的唯一目的。