Java错误 – 参数的非法修饰符 – 仅最终允许

以下代码有什么问题

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

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

可以使用以下给出的建议,但我想了解为什么它不被允许,尽管两者都是静态的?

您已经修改了您的问题:

我想理解为什么它不被允许,虽然两者都是静态的?

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

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

static关键字在字段上用于表示在类的所有实例中只存在一个此类成员,以及用于创建它们作为不需要实例的类成员的方法。 堆栈中的任何东西都没有静态的概念; 这是暂时的。 从方法调用返回后,堆栈框架及其上的所有局部变量将不复存在。

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

如何解决它

publicstatic不能在方法定义中使用。 因此,此错误告诉您允许在方法内定义的变量的唯一修饰符是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"; } 

说明

要理解为什么,您需要了解三个修饰符( publicstaticfinal )中的每一个本身的含义。 String Name只是说我们正在跟踪一个String并将其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描述了如何使用变量。 它在一个方法中是有意义的,因为它不是关于访问。

你不能在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"; } 

您不能将public static modifier用于局部变量。 做以下任何事情

 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是局部变量的唯一修饰符

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

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

因为你将String变量声明为public static final String Name =“Robin Wilson”;

根据java规则,当您在Main方法中声明它时,此String 名称是Local变量。 所以这里只允许最终决定。 您可以将其定义为** final String name =“Robin Wilson”; **在main方法中。 对于局部变量,只允许最终

组件的静态声明在类级别上可用。 声明方法中的组件使得方法的堆栈内存可用,因此只能通过对象访问。 静态属于全class。 因此,在声明变量static时没有意义。 如果你试图这样做,你甚至会得到编译时错误。 在此处输入图像描述 Final关键字与内存无关。