【问题标题】:Error in a static method in a inner class [duplicate]内部类中的静态方法出错[重复]
【发布时间】:2014-06-21 13:20:13
【问题描述】:

我试图了解内部类是如何工作的,在尝试一些简单的代码时出现错误:The method hello cannot be declared static; static methods can only be declared in a static or top level type

关于此代码

public class Class1 {
    public static void main(String[] args) {
        Class1 c = new Class1();
        c.show();
    }

    public static void show() { 
        class C2 { 

            static public void hello() { 
                System.out.println("show class");
            }
        }

        C2.hello();
    }

}

我不明白为什么!

【问题讨论】:

  • 我之前读过你的链接:The main focus is whiteboard questions, problems that you face while in front of your whiteboard designing your project. 我认为我的问题不是关于错误本身,而是对成员类如何工作的理解。我一直在等待一个答案,比如“你不能调用内部类而不使它成为静态等”,但最后我认为你是对的,如果我下次遇到这样的问题,我会在 stackoverflow 上发帖:)
  • 因为它在Java语言规范中是这样指定的。
  • this 可以帮到你
  • 谢谢你,我没有注意到我搜索的那个帖子!

标签: java class methods static


【解决方案1】:

请参阅documentation here

内部类:与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,由于内部类与实例相关联,它本身不能定义任何静态成员。

【讨论】:

    【解决方案2】:

    Class2 是一个内部类,这意味着它需要绑定到一个Class1 对象。那么Class2的对象就可以随时访问绑定对象的字段了:

    public class Class1 {
    
        private String name = "class1";
    
        public static void main(String[] args) {
            Class1 a = new Class1();
            Class2 c = a.new Class2();
            c.show();
        }
    
        class Class2 {
            public void show() {
                System.out.println("helloworld: "+name); //accessing the name field of a without needing the variable
            }
        }
    
    }
    

    或者您需要将 Class2 设为静态,因此它不需要 Class1 实例。

    public class Class1 {
        public static void main(String[] args) {
            Class2 c = new Class2();
            c.show();
        }
    
        static class Class2 {
            public void show() {
                System.out.println("helloworld");
            }
        }
    
    }
    

    【讨论】:

    • 感谢您的回答,但就记忆而言,您推荐第一个代码还是第二个代码?再次感谢您
    • @p3rand0r 他们有非常不同的用例,但选项 2 不需要第二个对象
    【解决方案3】:

    上面示例中的 C2 类是本地 Inner 类,这意味着在外部类的方法中定义的内部类,并且此类内部不能有静态方法,因为它们与对象相关联,(静态方法不是依赖于对象)。

    此外,本地内部类必须在它创建的方法内实例化,而不是在方法外。这是一条规则。

    尝试通过以下方式修改您的代码:

    public class Class1 {
        public static void main(String[] args) {
            Class1 c = new Class1();
            c.show();
    }
    
    public static void show() { 
        class C2 { 
    
            public void hello() { 
                System.out.println("show class");
            }
        }
    
        C2 obj= new C2();
    obj.hello();
    }
    
    }
    

    这应该可行。

    【讨论】:

      【解决方案4】:

      您不能这样做,因为您需要先创建“Class1”类的实例,然后才能访问“C2”类。然而,方法 'hello' 应该可以在不创建实例的情况下访问(作为静态方法)。

      【讨论】:

      • 我确实在 main 方法中创建了一个 Class1 的实例,但它仍然不起作用:/
      • 对.. 这就是编译器施加限制的原因。您需要创建一个实例来访问这些静态函数。
      猜你喜欢
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2015-02-16
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多