我试图了解内部类是如何工作的,并且在尝试使用一些简单的代码时出现错误: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();
}
}
我无法理解为什么!
答案 0 :(得分:2)
内部类:与实例方法和变量一样,内部类与其封闭类的实例相关联,并且可以直接访问该对象的方法和字段。此外,因为内部类与实例相关联,所以它本身不能定义任何静态成员。
答案 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'方法(作为静态方法)。