黑马程序员技术交流社区

标题: 内部类的问题 求解答 [打印本页]

作者: YI_LI_A_E    时间: 2015-4-2 15:31
标题: 内部类的问题 求解答
  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();
作者: 关山明月    时间: 2015-4-2 15:50
因为这个内部类是静态的
作者: ㏒假™面具    时间: 2015-4-2 15:53
内部类是静态的,静态成员可以通过类名直接调用,这句话可以写成new Outer().new Inner().function.
作者: 唯爱小七    时间: 2015-4-2 16:59
楼上正解
作者: JarryHorse    时间: 2015-4-2 19:46
㏒假™面具 发表于 2015-4-2 15:53
内部类是静态的,静态成员可以通过类名直接调用,这句话可以写成new Outer().new Inner().function. ...

new Outer().new Inner().function.,哥们,您这句话的意思相当于new了个Outer对象,再“对象.new Inner()”可以这样写?有这种写法的么?对象.属性/方法中间也不应该有个new吧?不过这问题还真不好解释,还要了解java的类加载机制,不然就只能说调用静态成员就是“类.成员”这样的格式的吧,记住就好
作者: ㏒假™面具    时间: 2015-4-2 22:28
可能是我描述不清晰!静态成员调用有两种方式
1.new Outer(). new Inner().function();对象.成员
2. new Outer.Inner().function(); 类名.成员
你想写成的new Outer().Inner().function()是哪种调用方式?
静态成员的调用,不可能是 类名().成员 吧?
作者: Sylvanas    时间: 2015-4-3 08:59
非static内部类在static方法中调用应该是new Outer.new Inner.func();而static内部类的话可以看做是个独立类,与外部类没有关联,用Inner.func()
作者: 夜班心桥    时间: 2015-4-4 10:39
首先,静态成员可以直接被“类名.”调用,也可以创建类的对象再通过"对象名."调用,
但我们不建议这么做,因为静态成员是随着类的加载而加载的,优先于对象存在。
所以,在这里,Inner 是静态内部类,而function方法时内部类的非静态方法,
其实楼主的那句话可以分解成这样:
Outer.Inner inner = new Outer.Inner();
inner.function();
至于:new Outer().Inner();这个意思就是:先创建Outer对象,然后通过 对象.Inner(),没有这样使用的啊!对象名只能调用成员方法和成员变量。
但是当Inner为非静态内部类时,而且该内部类在成员位置上时,可以在main方法里这样调用:
Outer.Inner inner = new Outer().new Inner();
希望对你有些帮助。

作者: lwj123    时间: 2015-4-4 11:10
new Outer.Inner().function();
你可以将Outer.Inner看内部类的全名。
所以 new Outter.Inner()就是创建了内部类对象
拿着内部类对象去访问function这个内部类的非静态成员。
我觉得这样做才是正确的




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