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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 喜欢流浪 中级黑马   /  2013-5-30 21:38  /  1199 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 喜欢流浪 于 2013-5-30 22:23 编辑

写出下列代码的结果
  1. class TD
  2. {
  3.         int y=6;
  4.         class Inner
  5.         {
  6.                 static int y=3;  
  7.                 void show()
  8.                 {
  9.                         System.out.println(y);
  10.                 }
  11.         }
  12. }
  13. class TC
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 TD.Inner ti=new TD().new Inner();
  18.                 ti.show();
  19.         }
  20. }
复制代码
老师给出的直接答案是:
编译失败,非静态内部类中不可以定义静态成员。
内部类中如果定义了静态成员,该内部类必须被静态修饰。

我直接将原题进行编译 会出现
内部类不能有静态声明的提示;
查阅发现有这样解释:
         内部类的对象默认持有创建它的那个封装类的一个对象的句柄。
       然而,假如我们说一个内部类是static的,这种说法却是不成立的。static内部类意味着:
  (1) 为创建一个static内部类的对象,我们不需要一个外部类对象。
  (2) 不能从static内部类的一个对象中访问一个外部类对象。
所以我想说本题的直接错误是 内部类中不能有静态声明 因此
修改:内部类中不能有静态声明 修改 将static 去掉

不知道对不对啊!




4 个回复

倒序浏览
  1. class TD

  2. {

  3.         int y=6;

  4.        static  class Inner

  5.         {

  6.                 static int y=3;  

  7.                 void show()

  8.                 {

  9.                         System.out.println(y);

  10.                 }

  11.         }

  12. }

复制代码
修改:内部类中不能有静态声明 修改 将static 去掉

不对,这个可以有 ,把内部类也变成静态的就可以有了
回复 使用道具 举报
逸盏清茶 发表于 2013-5-30 22:04
不对,这个可以有 ,把内部类也变成静态的就可以有了

ok ,谢谢了。这样改的话,就是直接用,不用再创建对象了!
回复 使用道具 举报
可以把static去掉,就可以了。要是把内部类修饰为静态的,调用方法要改成TD.Inner ti = new TD.Inner();     ti.show();  输出都是3。
回复 使用道具 举报
非静态内部类 依赖于一个外部类对象,而静态域/方法是不依赖与对象——仅与类相关
因此,非静态内部类中不能定义静态域/方法,编译过不了

要想编译通过 有几种改法  
1、第六行  static去掉
2、第六行   static final int y=3;   //变成静态常量
3、把class Inner 也变成静态 但17行得 改为   TD.Inner inner= new TD.Inner();
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马