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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵家阳 中级黑马   /  2013-3-19 11:29  /  1181 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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. }
复制代码
问题在代码注释里,请高手详解。。。。。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

4 个回复

倒序浏览
  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的。
复制代码
第一句 创建内部类,因内部类是静态的 ,又在外部类的成员位置上,可直接被类名调用啊
第二句 对象调用 方法啊
第三句 创建非静态内部类对象,不能再采用第一句那种类名直接调用的方式了,先创建外部类对象 再内部类

第二个问题 类名调用自己内部静态的成员 这里如果内部类在成员位置也相当于成员啊 如果是静态的话 可以被类名直接调用啊 这和外部类是否是静态貌似没关系吧
但是 被静态修饰的内部类,其内部的方法 也须是静态的 。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 赵家阳 于 2013-3-19 12:20 编辑
袁术森 发表于 2013-3-19 12:00
这段代码有问题啊  编译可通过 ,运行就问题了第一句 创建内部类,因内部类是静态的 ,又在外部类的成员位 ...

  • static void function()
  • {
  •          Inner.function();        //静态调用
  • }
这个我知道,会造成栈溢出。StackOverflowError,粘的时候忘记删了。但是下面两句:

Outer.Inner oi = new Outer.Inner();      
Outer.Inner2 oo = new Outer().new Inner2();   
这两句代码的执行过程是怎么样的?

评分

参与人数 1技术分 +1 收起 理由
贾文泽 + 1

查看全部评分

回复 使用道具 举报
你是想问 在内存中是怎样的体现的吧
这个具体的我就不是太清楚了 我只记得老毕讲的时候把在成员位置的内部类当作成员对待就容易理解
回复 使用道具 举报
如果一个属性或方法使用了static声明的话,表示的是独立于类之外的,而内部类也可以使用static声明,但是使用static定义的内部类就成为了外部类,外部可以直接使用。
        不过使用static定义的内部类只能访问外部类中的static属性或方法。

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马