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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付左军 中级黑马   /  2012-5-2 15:26  /  2478 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Outer
  2. {
  3.         private static int x=3;
  4.         static class Inner1
  5.         {
  6.                 static void function()
  7.                 {
  8.                         System.out.println("inner1..."+x);
  9.                 }
  10.         }
  11.         class Inner2
  12.         {
  13.                 void show()
  14.                 {
  15.                         System.out.println("inner2----");
  16.                 }
  17.         }
  18.         public static void method()
  19.         {
  20.                 new Inner2().show(); //此处编译错误,我要调用非静态的方法,创建了对象。为什么不可以访问
  21.         }
  22. }

  23. class  InnerDemo2
  24. {
  25.         public static void main(String[] args)
  26.         {
  27.                 Outer.method();
  28.         }
  29. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

6 个回复

倒序浏览
本帖最后由 天道酬勤 于 2012-5-2 15:42 编辑

01.class Outer

02.{

03.        private static int x=3;

04.        static class Inner1

05.        {

06.                static void function()

07.                {

08.                        System.out.println("inner1..."+x);

09.                }

10.        }

11.        class Inner2

12.        {

13.                void show()

14.                {

15.                        System.out.println("inner2----");

16.                }

17.        }

18.        public static void method()

19.        {

20.                new Inner2().show(); //此处编译错误,我要调用非静态的方法,创建了对象。为什么不可以访问
                                                     //静态只能访问静态,你创建了一个对象,就相当于有一个this,
                                                   //你认为静态中存在this吗?你在静态的方法中访问了非静态的数据,你觉的可以吗?
                                                  //因为静态随着类的加载而加载,优先于对象所以在编译时会报错。   


21.        }

22.}

23.

24.class  InnerDemo2

25.{

26.        public static void main(String[] args)

27.        {

28.                Outer.method();

29.        }

30.}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
静态内部类只能够引用外部类中的静态成员方法或者静态成员变量。对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。
回复 使用道具 举报
本帖最后由 刘基军 于 2012-5-2 15:48 编辑

public static void method()
        {
                new Outer().new Inner2().show(); //Inner2是Outer的一个非静态成员变量,要想在Outer的静态方法中访问它,肯定得先创建出Outer对象,然后才会有Inner2,继而通过Outer对象创建Inner2对象
        }

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
是这样的,public static void method()是静态的,它是优于对象存在的,那么它在内存中存在了,但是它加载的时候发现里面有个对象,但是不知道是哪个类的,因这不是静态的,还没有加载进来,以报错的。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
这是因为:
内部类的方法可以访问外部包装类的成员;
而外部包装类的方法中不能访问内部类的成员。
回复 使用道具 举报
1.  不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量, 不能在静态方法中使用this 关键字。  
2 . 总结:静态的只能访问静态的;非静态的可以访问一切。
如果要 Inner2().show()方法   修改代码如下
01.class Outer

02.{

03.        private static int x=3;

04.        static class Inner1

05.        {

06.                static void function()

07.                {

08.                        System.out.println("inner1..."+x);

09.                }

10.        }

11.        class Inner2

12.        {

13.                void show()

14.                {

15.                        System.out.println("inner2----");

16.                }

17.        }



22.}

23.

24.class  InnerDemo2

25.{

26.        public static void main(String[] args)

27.        {

28.              Outer.Inner2    inner2   = new   Outer().new Inner2();
                    inner2.show();
29.        }

30.}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马