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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈世涛 中级黑马   /  2012-7-19 12:34  /  2848 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Outer
{
        int num = 4;
        //内部类。
         class Inner
        {
          static int num = 5;    //为什么会出现这种情况???
                void method()
                {
                int num = 6;
                System.out.println("method run .."+Outer.this.num);
                        System.out.println("method run .."+this.num);
                }
        }
        public void show()
        {
                Inner in = new Inner();
                in.method();
        System.out.println("num="+this.num);
        System.out.println("num="+in.num);
        }
}
       

class InnerClassDemo
{
        public static void main(String[] args)
        {
                new Outer().show();
                new Outer().new Inner().method();
        }
}

InnerClassDemo.java:7: 内部类不能有静态声明
          static int num = 5;
                     ^
1 错误


求详解。。。

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

8 个回复

倒序浏览
  1. class Outer
  2. {
  3.         int num = 4;
  4.         //内部类。
  5.          class Inner
  6.         {
  7.           static int num = 5;    //为什么会出现这种情况???
  8. //这里你忽略了一个细节,那就是,当你改变量用static修饰的时候,那么内部类也必须是静态的,也就是说该内部类也必须用static修饰
  9.                 void method()
  10.                 {
  11.                 int num = 6;
  12.                 System.out.println("method run .."+Outer.this.num);
  13.                         System.out.println("method run .."+this.num);
  14.                 }
  15.         }
  16.         public void show()
  17.         {
  18.                 Inner in = new Inner();
  19.                 in.method();
  20.         System.out.println("num="+this.num);
  21.         System.out.println("num="+in.num);
  22.         }
  23. }
  24.         

  25. class InnerClassDemo
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 new Outer().show();
  30.                 new Outer().new Inner().method();
  31.         }
  32. }

复制代码
回复 使用道具 举报
static int num = 5;    //为什么会出现这种情况???
如果内部类中有静态成员,那么这个类也必须是静态的
回复 使用道具 举报
可以详细点吗??、
回复 使用道具 举报
我的理解:
static int num = 5; 静态变量num的初始化是在对象创建之前完成。
class Inner   非静态内部类 初始化必在外部类对象创建后以后完成。
这就矛盾了,所以非静态内部类不能有静态成员。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
内部类能够被static成员修饰符修饰。被static修饰的内部类只能访问外部类中的静态成员。
内部类没有用静态修饰时,里面不能有静态内容。
内部类特点
                A:内部类可以直接访问外部类的成员,包括private修饰的。
                B:外部类要想访问内部类,必须创建对象。
在类中所在的位置可分为:
                A:成员位置


回复 使用道具 举报
我还没写完就发出去了。。。
在成员位置上时,它可以被private修饰,它也可以被static修饰,它只能访问外部类中的静态成员。
B:局部位置
               它可以访问外部类的成员,也可以访问局部变量,但是访问局部的变量必须 被final修饰,其实也就是常量。
               它不可以被private或者static修饰。
你这里所在的是成员位置。它要把他的成员变量设为静态,那么他的类也必须要用静态修饰。否则类没创建对象出来就不会初始化,他的成员变量是加载不了的。
但是如果是静态他被初始化时就会被加载。这就会产生矛盾。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
杨康 中级黑马 2012-7-19 14:23:08
8#
如果内部类在外部类成员位置上,内部类中有静态成员,那么内部类也必须被静态所修饰。
回复 使用道具 举报
static int num = 5;    //为什么会出现这种情况???
这里的num是内部类中的变量 ,跟外部类Outer中的num变量没有关系。就好比A类中可以定义一个名为num的变量,B类中也可以定义一个名为num的变量
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马