为什么java没有';不允许创建内部类的实例?
我有一个主类“m”和两个名为sub1、sub2的内部类,其中sub2是静态类:为什么java没有';不允许创建内部类的实例?,java,class,instance,main,Java,Class,Instance,Main,我有一个主类“m”和两个名为sub1、sub2的内部类,其中sub2是静态类: 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 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();
}
}
我使用Openjdk在linux下编译它,它报告错误
$ 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();”,但在主函数中,我们不能
2.staic类sub2可以有实例,而非静态sub1不能
这是Java的设计吗?为什么?- 非静态内部类被视为外部类的成员李>
- 要创建它们的实例,需要使用外部类的引用李>
OuterClass outer = new OuterClass();
InnerClass inner = outer.new InnerClass();
所以,在你的情况下
m obj = new m();
sub1 s1 = obj.new Sub1();
“内部类被视为外部类的成员变量。”这是什么意思?内部类不是外部类的成员变量。他们是以什么方式被“对待”的?也许是我写的有点让人困惑的词。我的意思是说它们作为外部类的成员,因此需要使用外部类引用来访问它们。我从kathie sierra为SCJP撰写的书中,第八章关于内部类的章节中研究了这一点。“非静态内部类被视为外部类的成员。”这是事实,但静态成员类也是外部类的成员。JLS:“成员类是其声明直接包含在另一个类或接口声明中的类。”内部类的唯一特殊之处是它们有一个封闭实例。