【问题标题】:Why java doesn't allow to create instance of inner class? [duplicate]为什么java不允许创建内部类的实例? [复制]
【发布时间】:2017-03-03 08:31:33
【问题描述】:

我有一个主类“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 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. 静态类sub2可以有实例,而非静态类sub1不能?

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

【问题讨论】:

    标签: java class instance main


    【解决方案1】:
    • 非静态内部类被视为外部类的成员。
    • 要创建它们的实例,您需要使用外部类的引用。

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

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

    所以,在你的情况下,

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

    【讨论】:

    • "内部类被视为外部类的成员变量。"这是什么意思?内部类不是外部类的成员变量。他们以何种方式被“对待”?
    • 我写的字可能有点混乱。我的意思是说它们充当外部类的成员,因此需要使用外部类引用来访问它们。我从 Kathie sierra 为 SCJP 写的书,关于内部类的第 8 章研究了这一点。
    • "非静态内部类被视为外部类的成员。"确实如此,但静态成员类也是外部类的成员。 JLS:“成员类是其声明直接包含在另一个类或接口声明中的类。”内部类的唯一特别之处是它们有一个封闭的实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 2019-11-01
    • 2014-08-31
    • 2012-12-19
    • 2016-07-26
    • 2011-04-24
    • 2018-02-22
    相关资源
    最近更新 更多