2016-10-21 84 views
3

我有一个主类别 “m” 和2个内部类称为SUB1,SUB2,其中SUB2是静态类:为什么java不允许创建内部类的实例?

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.在mf()成员函数中,我们可以“sub1 s1 = new sub1();”,但在main中,我们不能 2. staic class sub2可以有实例,静态sub1 cann't?

这是Java的设计吗?为什么?

回答

7
  • 非静态内部类被视为外部类的成员。
  • 要创建它们的实例,您需要使用外部类的引用。

所以,你必须做这样的事情,

OuterClass outer = new OuterClass(); 
InnerClass inner = outer.new InnerClass(); 

所以,你的情况,

m obj = new m(); 
sub1 s1 = obj.new Sub1(); 
+0

“内部类作为外部类的成员变量进行处理。”这是什么意思?内部类不是外部类的成员变量。他们以什么方式“被对待”? –

+0

也许有点混乱的话我写了。我的意思是说,它们充当外部类的成员,因此需要使用外部类引用来访问它们。我已经从kathie sierra的书SCJP,第八章内部课程学习了这个。 –

+0

“非静态内部类被视为外部类的成员。”这是真的,但静态成员类也*外部类的成员。 JLS:“成员类是一个类,其声明直接包含在另一个类或接口声明中。”内部类唯一特别的是它们有一个封闭的实例。 –

相关问题