黑马程序员技术交流社区

标题: 访问静态内部类的静态成员 [打印本页]

作者: 2528870651    时间: 2014-3-20 08:50
标题: 访问静态内部类的静态成员
本帖最后由 2528870651 于 2014-3-20 19:12 编辑
  1. class Outer
  2. {
  3.         private static int x=3;
  4.    static class Inner
  5.         {
  6.                 static void function()
  7.                 {
  8.                         System.out.println("inner :"+x);
  9.                 }
  10.         }
  11. }



  12. class InnerDemo2
  13. {
  14.         public static void main(String[] args)
  15.         {
  16.                         new Outer.Inner().function();   //编译成功
  17.                         Outer.Inner.function();          //编译成功  ,这两种都可以
  18.                         new Outer.Inner.function();      //编译失败  
  19.                                 
  20.         }
  21. }
复制代码


谁解释一下,老师说的是  用 Outer.Inner.function(); 实现
为什么  new Outer.Inner().function();  也可以呢?? 我试了,编译成功,运行也没问题啊 !
                           
作者: 陈果    时间: 2014-3-20 09:00
当然可以了,静态成员函数属于成员函数,只要是成员函数就可以先new对象再调用(前提是有足够的访问权限),而静态的访问方式还有直接调用的方法
作者: osully    时间: 2014-3-20 09:58
静态是共享数据
对象当然可以调用共享数据了
作者: sgs_gzy    时间: 2014-3-20 10:12
因为内部类被定义成static后,可以直接被外部类用类名调用,
new Outer.Inner.function();      这种外部类调用内部类的方法,你前面加个new是什么意思?new function()?
貌似目前还没看过!
作者: 赵卓辉    时间: 2014-3-20 10:17

  1. package com.itheima;

  2. class Outer //外部类
  3. {
  4.         private static int x=3;
  5.    static class Inner         //静态内部类
  6.         {
  7.                 static void function()        //静态方法
  8.                 {
  9.                         System.out.println("inner :"+x);
  10.                 }
  11.         }
  12. }



  13. class InnerDemo2
  14. {
  15.         public static void main(String[] args)
  16.         {
  17.               new Outer.Inner().function();  
  18.                //这里编译成功,因为你用new创建了一个Inner对象,调用function方法
  19.               Outer.Inner.function();
  20.               //这里编译成功因为function方法是静态的,可以直接用类名.方法名调用
  21.                //  new Outer.Inner.function();
  22.                       //编译失败  ,因为你用new关键字创建一个新的对象,类名的后面必须是一组构造方法参数(必须带括号)。                                       
  23.         }
  24. }

  25. /*运行结果:
  26.           inner :3
  27.         inner :3
  28. * */
复制代码

作者: 2528870651    时间: 2014-3-20 15:00
sgs_gzy 发表于 2014-3-20 10:12
因为内部类被定义成static后,可以直接被外部类用类名调用,
new Outer.Inner.function();      这种外部类 ...

哦  这个是黑马以前学员提供的资料,上面可能多打了一个new ,还好试了一下,不然悲剧了,编译失败!!
作者: 2528870651    时间: 2014-3-20 15:01
赵卓辉 发表于 2014-3-20 10:17

既然如此,那么访问静态和非静态的时候都用这个不就好了,还会搞混,或者忘了一个关键字就不爽了!
作者: my_heima    时间: 2014-3-20 16:57
赵卓辉 发表于 2014-3-20 10:17

仁兄正解,将类new一个实例对象的时候必须带有参数,参数为空时就是一个(),楼主new Outer.Inner调用成员方法肯定会出错喽,要想直接用类名调用就不需要new对象了。
作者: my_heima    时间: 2014-3-20 16:59
静态成员,可用类名直接调用,也可用对象实例调用,所以老师说的和你试验的是两种不同的调用方法。
作者: 2528870651    时间: 2014-3-20 19:09
谢谢 你们的回答 !!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2