【问题标题】:Java Error - Illegal Modifier for Parameter - Only final PermittedJava 错误 - 参数的非法修饰符 - 只有最终允许
【发布时间】:2021-03-15 02:13:44
【问题描述】:

下面的代码有什么问题

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

String Reference Name 显示编译错误 - Java 错误 - 参数名称的非法修饰符 - 仅允许 final

我对以下给出的建议没问题,但我想了解为什么它不允许,尽管两者都是静态的?

【问题讨论】:

  • 我可以接受下面给出的建议,但我想了解为什么它不允许,尽管它们都是静态的?

标签: java


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    【解决方案2】:

    如何解决

    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 描述了如何使用该变量。它在方法中是有意义的,因为它与访问无关。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        你不能对局部变量使用 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是局部变量的唯一修饰符

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  【解决方案9】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 2012-08-02
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-09-08
                    • 2017-03-07
                    • 1970-01-01
                    • 2023-03-31
                    • 2011-09-20
                    相关资源
                    最近更新 更多