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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-王燚 中级黑马   /  2012-10-7 00:06  /  2759 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. class Test94
  2. {
  3.         int y=6;
  4.         class Inner
  5.         {
  6.                 static int y=3;   //程序提示这里报错,
  7.                 void show()
  8.                 {
  9.                         System.out.println(this.y);  
  10.                 }
  11.         }
  12. }
  13. class TC
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.                 Test94.Inner ti=new Test94().new Inner();   
  18.                 ti.show();             
  19.         }
  20. }

复制代码
我想问下报错的地方,为什么内部类里面有static成员后,这个内部类就必须定义成static???不是很明白,求各位大神详细解决。。

10 个回复

正序浏览
崔政 中级黑马 2012-10-11 17:55:25
10#
楼上各种高手回答啊,厉害,懂了
回复 使用道具 举报
孙含庆 发表于 2012-10-7 10:25
谢谢纠正啊,其实我前两句已经说明了规则,第三句说的太不清不楚了,下回说清楚。一块学习哈。 ...

呵,你说对的东西我自然不会纠正了,加油.
回复 使用道具 举报

RE: 关于内部类的static静态成员的疑问

马镱洵 发表于 2012-10-7 07:59
"//非静态内部类需要创建才有,而静态属性是先于对象就存在的,所以不允许这样定义"

这句是解释不了的.

谢谢纠正啊,其实我前两句已经说明了规则,第三句说的太不清不楚了,下回说清楚。一块学习哈。
回复 使用道具 举报
李志群 发表于 2012-10-7 01:22
static修饰符       
                内部类一旦加了静态,出现访问局限性,只能访问外部类中的静态成员。
                内部类被静态后, ...

当我看到你的倒数第二段时我已经点了"回复",准备好要纠正你了.当我看到你泊最后一句时,我打消了纠正的念头.
哈哈,你对内部类理解的不错,加油.
回复 使用道具 举报
孙含庆 发表于 2012-10-7 00:59
class Test94
{
        int y=6;

"//非静态内部类需要创建才有,而静态属性是先于对象就存在的,所以不允许这样定义"

这句是解释不了的.
我就举一个例子:
一个外部类中可以有一个静态属性,同样,外部类也是需要创建才有,并且这个静态属性也是先于外部类对象就存在的,可是外部类里为什么就可以有静态属性?
所以你的这个解释是说不通的.
回复 使用道具 举报
吕书凯 发表于 2012-10-7 00:20
被静态修饰的内部类成员会在内部类加载前先加载,如果内部类不是静态的,就会造成没有内部类就先有了内部类 ...

"如果内部类不是静态的,就会造成没有内部类就先有了内部类的成员,这是不允许的,所以内部类也要是静态,这样静态内部类加载后静态成员也加载"

你这解释似乎是说不通的.
因为就算内部类不是静态的,而内部类有成员是静态的,你只要不实例化内部类对象(当然不只是new内部类对象了,一共有6种主动调用,可以使JVM加载类,从而将类中的静态成员加载进数据区中.),内部类中的静态成员也是不会被加载的.要知道,一个类的静态成员想要被加载进数据区中,必须要是6种主动使用的其中一种才可以.你若只是将一个静态成员写进一个类(不管这个类是静态的还是非静态的,当然只有内部类才可能是静态的.)中,只要在主动使用这个类时(6种主动使用方式之一),JVM才会将类中的静态成员加载进数据区中.
所以你的这个说法讲不通.
回复 使用道具 举报
static修饰符       
                内部类一旦加了静态,出现访问局限性,只能访问外部类中的静态成员。
                内部类被静态后,会随着外部类的加载而加载。

                类什么时候用,什么时候进内存。
                访问出现了局限性。
               
                访问静态内部类中的非静态成员。
                直接new内部类的对象,
                外部类名.内部类名 变量名 = new 外部类名.内部类名();
               
                访问静态内部类中的静态成员:不需要对象。

                外部类名.内部类名.内部类里面的静态方法();


                如果内部类中定义了静态成员,该内部类必须被静态修饰,否则编译失败。

记住:只有内部类定义在外部类的成员位置上,才具备这些修饰符。


内部类也可以定义在外部类中的局部位置上。(不能被静态修饰,局部位置上不能定义静态)
        1,可以访问外部类的成员变量,
        2,局部的不可以访问,

内部类定义在局部位置上,不允许访问局部中的变量。只能访问被fianl修饰的局部常量。
回复 使用道具 举报
嗯 确实
所以如果只改内部的static int y = 3;的话有三种方法
1, int y = 3;
2,static final int y = 3;
3,final int y = 3;
回复 使用道具 举报

class Test94
{
        int y=6;
        class Inner
        {
                static int y=3;                    //静态内部类可以有静态成员,也可以有非静态成员。静态成员不能访问非静态成员。

                                //但是非静态内部类里不允许有静态方法,静态属性,静态代码块。

                                //非静态内部类需要创建才有,而静态属性是先于对象就存在的,所以不允许这样定义。   
             void show()
                {
                        System.out.println(this.y);  
                }
        }
}
class TC
{
        public static void main(String[] args)
        {
                Test94.Inner ti=new Test94().new Inner();   
                ti.show();              
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马