cdsfiui 发表于 2016-10-21 14:18

为什么在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 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编译有错误:
$ javac m.java
m.java:24: 错误: 无法从静态上下文中引用非静态 变量 this
    sub1 s1=new sub1();//Error
            ^
1 个错误

很奇怪的地方是:
1. 在m的成员函数里面,可以sub1 s1=new sub1();但是在main函数里面就不可以,有语法错误。
2. 静态类sub2竟然都可以声明实例,但是非静态类sub1反而不行。

这个是java设计的什么原则导致的?

lzj123 发表于 2016-10-21 18:03

非static内部类需要外部类的引用才能访问外部类的成员啊,think in java里说的很明白了

yunshouhu 发表于 2016-10-22 19:48

main函数是static函数。
页: [1]
查看完整版本: 为什么在main里面不能创建内部类的实例?