A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李栋梁 中级黑马   /  2012-11-22 10:00  /  1943 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李栋梁 于 2012-11-22 13:19 编辑

不是静态的内部类为什么主方法不能new同该内部类,而在一般方法里就可以的?如下例子:
public class Test
{
       class  Inner{}
       public static void main(String[] args)
       {
              //new Inner();  //报错的
       }
       void method()
      {
            new Inner();//这又是不报错的,为啥?
      }
}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

10 个回复

倒序浏览
主函数是静态方法,你的内部类在成员位置上,它和主函数是同一个级别的。
而静态函数只能访问静态成员。所以只有你的内部类是静态的,才可以在主函数里面直接new,否则会报错。
而非静态方法,可以访问非静态成员,就不会报错了

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
没有报错啊,请把错误信息贴出来

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 支持新人

查看全部评分

回复 使用道具 举报
你在主函数里面直接new都没定义,就会出错
回复 使用道具 举报
当然会报错了,静态方法怎么能访问非静态属性呢?
下面的那个方法又不是静态方法

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
jerry2627 发表于 2012-11-22 11:44
当然会报错了,静态方法怎么能访问非静态属性呢?
下面的那个方法又不是静态方法 ...

什么静态属性?
回复 使用道具 举报
崔利鹏 发表于 2012-11-22 11:29
你在主函数里面直接new都没定义,就会出错

定义?我刚才编译了一下,没有报错:(
回复 使用道具 举报
本帖最后由 翟晓磊 于 2012-11-22 12:25 编辑
张学永 发表于 2012-11-22 12:18
主函数是静态方法,你的内部类在成员位置上,它和主函数是同一个级别的。
而静态函数只能访问静态成员。所 ...

你自己编译过吗?
外部类的静态方法访问成员内部类,与在外部类外部访问成员内部类一样
  1. public static void outer_f4() {
  2.                 System.out.println("outer_f4");
  3.                 //step1 建立外部类对象
  4.                 Outer out = new Outer();
  5.                 //step2 根据外部类对象建立内部类对象
  6.                 Inner inner = out.new Inner();
  7.                 //step3 访问内部类的方法
  8.                 inner.inner_f1();
  9.         }
复制代码
回复 使用道具 举报
翟晓磊 发表于 2012-11-22 12:24
你自己编译过吗?

Inner inner = out.new Inner();楼主的本意好像不是这么调用吧?
貌似楼主的意思是 Inner inner = new Inner();会编译错误,不是你这么编译的,你这么编译就不叫直接访问了
回复 使用道具 举报
张学永 发表于 2012-11-22 12:36
Inner inner = out.new Inner();楼主的本意好像不是这么调用吧?
貌似楼主的意思是 Inner inner = new In ...

我直接编译了楼主的代码,没有报错。看来需要更详细的测试了。我去试试
回复 使用道具 举报
本帖最后由 翟晓磊 于 2012-11-23 11:10 编辑

错误信息
  1. >javac Demo.java
  2. Demo.java:1: 类 Test 是公共的,应在名为 Test.java 的文件中声明
  3. public class Test
  4.        ^
  5. Demo.java:10: 无法从静态上下文中引用非静态 变量 this
  6.               Inner in = new Inner();  //报错的
  7.                          ^
  8. 2 错误
复制代码
应该是这样的
1.建立外部类对象
2.根据外部类对象建立内部类对象:<code> Inner in = out.new Inner();</code>
3.访问内部类的方法
这样就不报错了,因为内部类默认有对外部类的引用,所以必须先有外部类
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马