Java 错误 - 参数的非法修饰符 - 仅允许 final

IT小君   2021-10-27T02:25:31

下面的代码有什么问题

public static void main(String[] args){
        public static final String Name = "Robin Wilson";
    }

字符串引用名称显示编译错误 - Java 错误 - 参数名称的非法修饰符 - 只有最终允许

可以接受以下给出的建议,但我想了解为什么不允许这样做,尽管两者都是静态的?

点击广告,支持我们为你提供更好的服务
评论(9)
IT小君

你已经修改了你的问题来问:

我想了解为什么不允许这样做,尽管两者都是静态的?

方法内的变量仅存在于堆栈框架中。每次调用方法时,JVM 都会创建一个新的堆栈帧,并在方法完成后将其丢弃。

public关键字用于类、方法和字段以控制访问。没有可以应用于堆栈(局部)变量的访问概念。它仅在调用时存在于方法内部,并且只能从方法内部访问。

static关键字用于上的字段来表示只有一个这样的成员跨类的所有实例存在,并且方法来创建他们作为不需要一个实例类的成员。堆栈上的任何东西都没有静态的概念;这是暂时的。一旦从方法调用返回,堆栈帧及其上的所有局部变量就不再存在。

基本上,在谈论局部变量时两者都没有任何意义。

2021-10-27T02:25:32   回复
IT小君

如何修复

public并且static不能在方法定义中使用。所以这个错误告诉你,在方法内部定义的变量允许的唯一修饰符final.

您可以通过删除有问题的修饰符来修复它:

class MyClass
{
    public static void main(String[] args){
        final String Name = "Robin Wilson";
    }
}

或者像这样将变量定义移出方法

class MyClass
{
    public static void main(String[] args){
    }

    public static final Name = "Robin Wilson";
}

解释

要了解原因,您需要了解三个修饰符(publicandstaticfinal)各自的含义。String Name只是说我们正在跟踪 aString并调用它Name

民众

class MyClass
{
    public String Name = "Robin Wilson";
}

public表示程序的任何部分都可以读取它(否则只能由编写在MyClass类中的代码读取)。

public指定哪些其他代码可以访问它。在方法中,这是没有意义的。方法内部定义的变量只能在该方法内部访问,一旦方法完成,它们就会被抛出。所以这些变量不可能是public.


静止的

class MyClass
{
    static String Name = "Robin Wilson";
}

static表示Name变量是类本身的一部分,而不是类的实例。换句话说,MyClass类的所有实例共享同一个Name变量。

static指定如何访问它(在类的实例上或通过类本身)。在方法内部这是没有意义的,因为局部变量在方法关闭后被丢弃,所以没有其他东西可以访问它。


最终的

class MyClass
{
    final String Name = "Robin Wilson";
}

final表示Name一旦赋值,就永远不会改变。

final描述变量将如何使用。它在方法中是有意义的,因为它与访问无关。

2021-10-27T02:25:32   回复
IT小君

你不能在里面声明它main,把它放在方法之外,你想要它作为[类成员]:

public static final String Name = "Robin Wilson";
public static void main(String[] args) throws IOException {  }

否则(我认为这不是您想要的)只需public static从那里删除并简单地写:

public static void main(String[] args){
    final String Name = "Robin Wilson";
}
2021-10-27T02:25:32   回复
IT小君

您不能对局部变量使用 public static 修饰符。执行以下任一操作

public static void main(String[] args){
        final String Name = "Robin Wilson";
    }

或将其声明为成员变量

public static final String Name = "Robin Wilson";

public static void main(String[] args){

 }

记住 final 是局部变量的唯一修饰符

2021-10-27T02:25:32   回复
IT小君

您不能将局部变量(方法内部的变量是局部变量)声明为public static. 相反,以下代码将起作用:

public static void main(String[] args){
        final String Name = "Robin Wilson";
    }
2021-10-27T02:25:32   回复
IT小君

正如您将 String 变量声明为public static final String Name = "Robin Wilson";

根据 java 规则,此字符串名称是本地变量,因为您在Main方法中声明它所以这里只允许final。您可以将其定义为 ** final String name="Robin Wilson";** 在 main 方法中。对于局部变量,允许使用final

2021-10-27T02:25:33   回复
IT小君

组件的静态声明在类级别上可用。在方法中声明组件可以在方法的堆栈内存中使用,因此只能通过对象访问。静态属于整个类。因此,他们没有必要声明一个静态变量。如果您尝试这样做,您甚至会收到编译时错误。 在此处输入图片说明 final 关键字与内存无关。

2021-10-27T02:25:33   回复
IT小君

这意味着您应该在“main”块之外编写静态函数。它会正常工作。享受

2021-10-27T02:25:33   回复
IT小君

修饰符 private、protected 和 public 不能用于方法内部的变量。这是因为您只能在方法内部使用局部变量。

Java 只是告诉您当时唯一允许的修饰符是 final 关键字。

2021-10-27T02:25:33   回复