为什么 java 不允许创建内部 class 的实例?
Why java doesn't allow to create instance of inner class?
我有一个主 class "m" 和 2 个内部 classes 称为 sub1,sub2,其中 sub2 是静态的 class:
public class m
{
String n="n";
static String s="s";
public class sub1
{
public void fn(){System.out.println(n);}
//static public void fs(){System.out.println(s);}
}
static class sub2
{
//public void fn(){System.out.println(n);}
static public void fs(){System.out.println(s);}
}
public void f()
{
sub1 s1=new sub1();//OK, no error
sub2 s2=new sub2();//OK
}
public static void main(String[] args)
{
m obj=new m();
sub1 s1=new sub1();//Error
s1.fn();
//s1.fs();
sub2 s2=new sub2();//OK
//s2.fn();
s2.fs();
}
}
我在linux下用Openjdk编译,报错
$ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
$ javac m.java
m.java:24: Error: Cannot reference non-static variable this in a static context.
sub1 s1=new sub1();//Error
^
1 Errors
这对我来说很奇怪:
1、在成员函数m.f()中可以"sub1 s1=new sub1();",在main中不可以
2. staic class sub2可以有instance,而non-static sub1不可以?
这是Java的设计吗?为什么?
- 非静态内部 classes 被视为外部 class 的成员。
- 要创建它们的实例,您需要使用外部 class 的引用。
所以你必须这样做,
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();
所以,在你的情况下,
m obj = new m();
sub1 s1 = obj.new Sub1();
我有一个主 class "m" 和 2 个内部 classes 称为 sub1,sub2,其中 sub2 是静态的 class:
public class m
{
String n="n";
static String s="s";
public class sub1
{
public void fn(){System.out.println(n);}
//static public void fs(){System.out.println(s);}
}
static class sub2
{
//public void fn(){System.out.println(n);}
static public void fs(){System.out.println(s);}
}
public void f()
{
sub1 s1=new sub1();//OK, no error
sub2 s2=new sub2();//OK
}
public static void main(String[] args)
{
m obj=new m();
sub1 s1=new sub1();//Error
s1.fn();
//s1.fs();
sub2 s2=new sub2();//OK
//s2.fn();
s2.fs();
}
}
我在linux下用Openjdk编译,报错
$ java -version
openjdk version "1.8.0_91"
OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~16.04.1-b14)
OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
$ javac m.java
m.java:24: Error: Cannot reference non-static variable this in a static context.
sub1 s1=new sub1();//Error
^
1 Errors
这对我来说很奇怪: 1、在成员函数m.f()中可以"sub1 s1=new sub1();",在main中不可以 2. staic class sub2可以有instance,而non-static sub1不可以?
这是Java的设计吗?为什么?
- 非静态内部 classes 被视为外部 class 的成员。
- 要创建它们的实例,您需要使用外部 class 的引用。
所以你必须这样做,
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();
所以,在你的情况下,
m obj = new m();
sub1 s1 = obj.new Sub1();