黑马程序员技术交流社区

标题: static内部类有木有??? [打印本页]

作者: 赵家阳    时间: 2013-3-19 11:29
标题: static内部类有木有???
  1. package com.itheima.preview;

  2. public class InnerClassDemo1 {
  3.         public static void main(String[] args)
  4.         {
  5.                 Outer o = new Outer();
  6.                 o.method();
  7.                 new Outer().method(); //等于上面,但是匿名的。
  8.                
  9.                
  10.                 Outer.show();        //静态调用。
  11.                
  12.        
  13.                 Outer.Inner oi = new Outer.Inner();                //Inner类是static的。
  14.                 oi.function();
  15.                
  16.                 Outer.Inner2 oo = new Outer().new Inner2();                //static是非static的。
  17.                
  18.                 /*
  19.                  * 问题一:上面这三局代码我怎么理解?
  20.                  */
  21.                
  22.                 Outer.Inner.function();               
  23.                 /*问题二:静态内部类的静态调用,可代替上面的语句。
  24.                  * 但是,Outer非static的,这么写怎么理解?
  25.                  */
  26.                
  27.                 new Outer.Inner().function();
  28.                
  29.                 Outer.show();
  30.         }
  31. }
  32. class Outer
  33. {
  34.         private int x = 3;
  35.        
  36.         static void show()
  37.         {
  38.                 System.out.println("静态成员测试");
  39.         }
  40.        
  41.         static  class Inner{       
  42.                 int x = 6;
  43.                 static void function()
  44.                 {
  45.                         Inner.function();        //静态调用
  46.                 }
  47.         }
  48.         class Inner2
  49.         {
  50.                 void function()
  51.                 {
  52.                        
  53.                 }
  54.         }
  55.         void method()
  56.         {
  57.                 new Outer.Inner().function();
  58.                 System.out.println(x);
  59.                 Inner i = new Inner();
  60.                 i.function();
  61.         }
  62. }
复制代码
问题在代码注释里,请高手详解。。。。。

作者: 袁术森    时间: 2013-3-19 12:00
  1.                 static void function()
  2.                 {
  3.                         Inner.function();        //静态调用
  4.                 }
复制代码
这段代码有问题啊  编译可通过 ,运行就问题了
  1. Outer.Inner oi = new Outer.Inner();                //Inner类是static的。
  2.                 oi.function();
  3.                
  4.                 Outer.Inner2 oo = new Outer().new Inner2();                //static是非static的。
复制代码
第一句 创建内部类,因内部类是静态的 ,又在外部类的成员位置上,可直接被类名调用啊
第二句 对象调用 方法啊
第三句 创建非静态内部类对象,不能再采用第一句那种类名直接调用的方式了,先创建外部类对象 再内部类

第二个问题 类名调用自己内部静态的成员 这里如果内部类在成员位置也相当于成员啊 如果是静态的话 可以被类名直接调用啊 这和外部类是否是静态貌似没关系吧
但是 被静态修饰的内部类,其内部的方法 也须是静态的 。
作者: 赵家阳    时间: 2013-3-19 12:18
本帖最后由 赵家阳 于 2013-3-19 12:20 编辑
袁术森 发表于 2013-3-19 12:00
这段代码有问题啊  编译可通过 ,运行就问题了第一句 创建内部类,因内部类是静态的 ,又在外部类的成员位 ...

这个我知道,会造成栈溢出。StackOverflowError,粘的时候忘记删了。但是下面两句:

Outer.Inner oi = new Outer.Inner();      
Outer.Inner2 oo = new Outer().new Inner2();   
这两句代码的执行过程是怎么样的?
作者: 袁术森    时间: 2013-3-19 12:31
你是想问 在内存中是怎样的体现的吧
这个具体的我就不是太清楚了 我只记得老毕讲的时候把在成员位置的内部类当作成员对待就容易理解
作者: android2050    时间: 2013-3-19 14:17
如果一个属性或方法使用了static声明的话,表示的是独立于类之外的,而内部类也可以使用static声明,但是使用static定义的内部类就成为了外部类,外部可以直接使用。
        不过使用static定义的内部类只能访问外部类中的static属性或方法。





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