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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 2528870651 高级黑马   /  2014-3-20 08:50  /  1240 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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();  也可以呢?? 我试了,编译成功,运行也没问题啊 !
                           

9 个回复

倒序浏览
当然可以了,静态成员函数属于成员函数,只要是成员函数就可以先new对象再调用(前提是有足够的访问权限),而静态的访问方式还有直接调用的方法
回复 使用道具 举报
静态是共享数据
对象当然可以调用共享数据了
回复 使用道具 举报
因为内部类被定义成static后,可以直接被外部类用类名调用,
new Outer.Inner.function();      这种外部类调用内部类的方法,你前面加个new是什么意思?new function()?
貌似目前还没看过!
回复 使用道具 举报

  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. * */
复制代码
回复 使用道具 举报
sgs_gzy 发表于 2014-3-20 10:12
因为内部类被定义成static后,可以直接被外部类用类名调用,
new Outer.Inner.function();      这种外部类 ...

哦  这个是黑马以前学员提供的资料,上面可能多打了一个new ,还好试了一下,不然悲剧了,编译失败!!
回复 使用道具 举报

既然如此,那么访问静态和非静态的时候都用这个不就好了,还会搞混,或者忘了一个关键字就不爽了!
回复 使用道具 举报

仁兄正解,将类new一个实例对象的时候必须带有参数,参数为空时就是一个(),楼主new Outer.Inner调用成员方法肯定会出错喽,要想直接用类名调用就不需要new对象了。
回复 使用道具 举报
静态成员,可用类名直接调用,也可用对象实例调用,所以老师说的和你试验的是两种不同的调用方法。
回复 使用道具 举报
谢谢 你们的回答 !!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马