为什么在main里面不能创建内部类的实例?

zdferex 2016-10-21 02:19:38
我有下面一个程序,想要测试一下主类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设计的什么原则导致的?
...全文
209 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zdferex 2016-10-21
  • 打赏
  • 举报
回复
我知道了,必须改成

sub1 s1=obj.new sub1();//Error
要从包含类的实例来创建。
  • 打赏
  • 举报
回复
main方法是static静态方法。java规定,静态方法只能访问静态变量

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧