内部类中的静态方法出错

时间:2014-05-05 09:29:14

标签: java class methods static

我试图了解内部类是如何工作的,并且在尝试使用一些简单的代码时出现错误: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();
    }

}

我无法理解为什么!

4 个答案:

答案 0 :(得分:2)

请参阅documentation here

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

答案 1 :(得分:1)

上面示例中的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();
}

}

这应该有用。

答案 2 :(得分:1)

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

}

答案 3 :(得分:0)

您无法执行此操作,因为您需要先创建Class'Class1'的实例,然后才能访问Class'C2'。但是,应该可以在不创建实例的情况下访问'hello'方法(作为静态方法)。