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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© YI_LI_A_E 中级黑马   /  2015-4-2 15:31  /  981 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Outer
  2. {
  3.         private static int x=3;
  4.         static        class Inner
  5.         {
  6.                 void function()
  7.                 {
  8.                         System.out.println(x);
  9.                 }
  10.         }
  11. }

  12. class Demo
  13. {
  14. public static void main(String[] args)
  15. {
  16.         new Outer.Inner().function();
  17. }
  18. }
复制代码

new Outer.Inner().function();这句话为什么不能写成new Outer().Inner().function();

8 个回复

倒序浏览
因为这个内部类是静态的
回复 使用道具 举报
内部类是静态的,静态成员可以通过类名直接调用,这句话可以写成new Outer().new Inner().function.

评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1 很给力!

查看全部评分

回复 使用道具 举报 0 1
楼上正解
回复 使用道具 举报
㏒假™面具 发表于 2015-4-2 15:53
内部类是静态的,静态成员可以通过类名直接调用,这句话可以写成new Outer().new Inner().function. ...

new Outer().new Inner().function.,哥们,您这句话的意思相当于new了个Outer对象,再“对象.new Inner()”可以这样写?有这种写法的么?对象.属性/方法中间也不应该有个new吧?不过这问题还真不好解释,还要了解java的类加载机制,不然就只能说调用静态成员就是“类.成员”这样的格式的吧,记住就好
回复 使用道具 举报
可能是我描述不清晰!静态成员调用有两种方式
1.new Outer(). new Inner().function();对象.成员
2. new Outer.Inner().function(); 类名.成员
你想写成的new Outer().Inner().function()是哪种调用方式?
静态成员的调用,不可能是 类名().成员 吧?
回复 使用道具 举报
非static内部类在static方法中调用应该是new Outer.new Inner.func();而static内部类的话可以看做是个独立类,与外部类没有关联,用Inner.func()
回复 使用道具 举报
首先,静态成员可以直接被“类名.”调用,也可以创建类的对象再通过"对象名."调用,
但我们不建议这么做,因为静态成员是随着类的加载而加载的,优先于对象存在。
所以,在这里,Inner 是静态内部类,而function方法时内部类的非静态方法,
其实楼主的那句话可以分解成这样:
Outer.Inner inner = new Outer.Inner();
inner.function();
至于:new Outer().Inner();这个意思就是:先创建Outer对象,然后通过 对象.Inner(),没有这样使用的啊!对象名只能调用成员方法和成员变量。
但是当Inner为非静态内部类时,而且该内部类在成员位置上时,可以在main方法里这样调用:
Outer.Inner inner = new Outer().new Inner();
希望对你有些帮助。
回复 使用道具 举报
new Outer.Inner().function();
你可以将Outer.Inner看内部类的全名。
所以 new Outter.Inner()就是创建了内部类对象
拿着内部类对象去访问function这个内部类的非静态成员。
我觉得这样做才是正确的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马