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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 马林康 于 2012-8-15 14:48 编辑
  1. public class InnerClassTest {
  2.     public static void main(String[] args){
  3.         Outer ou =new Outer();
  4.         Outer.Inner ui=ou.new Inner();
  5.         ui.function2();
  6.         Outer.Inner ui2=new Outer().new Inner();
  7.         ui2.function2();
  8.         
  9.     }

  10. }
  11. class Outer{
  12.     private int x=3;
  13.     class Inner{
  14.         int x=4;
  15.         void function1(){
  16.             System.out.println(x);
  17.             System.out.println(Outer.this.x);
  18.         }
  19.         void function2(){
  20.             Outer.this.method();
  21.         }
  22.     }
  23.     public void method(){
  24.         Inner in =new Inner();
  25.         in.function1();
  26.     }
  27. }
复制代码
Outer ou =new Outer();
        Outer.Inner ui=ou.new Inner();

评分

参与人数 1技术分 +1 收起 理由
张立江 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
1.关键是看该类是静态还是非静态内部类。
2.内部类分为
==>局部内部类
==>成员内部类:静态内部类和非静态内部类

在外部类以外定义内部类(静态/非静态)变量的语法格式:Outer.Inner var;

非静态内部类的对象必须寄存在外部类的对象中,在外部类以外创建非静态内部类的实例,
Outer.Inner in = new Outer().new Inner();

在外部类以外创建静态内部类的实例,此时内部类Inner使用static修饰
Outer.Inner in = new Outer.Inner();
static关键字的作用是将类的成员变成类相关,而不是实例相关。当使用static修饰一个内部类,则这个内部类属于外部类本身。

3.楼主的示例中内部类为非静态内部类,因而应该按如下格式创建内部类对象
Outer.Inner ui2=new Outer().new Inner();

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
这是可以的。
内部类根据位置的不同,可以分为两种情况。
1        内部类在成员位置,在这总情况下实现内部的实例对象方法是:外部类名.内部类名 名字 = 外部类对象.内部类对象
        即Outter.Inner oi = new Outter().new Inner();
        你所说的那种方法其实就是变形,将一个外部类对象的引用直接付给一个变量,这当然可以。
        注意:若内部类被静态修饰时,则变为外部类名.内部类名 对象名 = new 外部类.内部类()
        Outter.Inner oi = new Outter.Inner();而且Outter.new Inner()不能写成new Outter().new Inner()
  1. class Outter
  2. {
  3.         String name;
  4.         class Inner//注意如果Inner类含有被static修饰的成员是,则Inner也必须被static修饰
  5.                            //当外部类的静态方法访问内部类时,该内部类Inner也必须为静态,
  6.         {
  7.         }
  8.         public void show()
  9.         {
  10.         }
  11. }
复制代码
2        内部类在局部时可以直接访问外部类中的成员,也可以直接访问局部成员,但是局部成员要用final修饰。
  1. class Outter
  2. {
  3.         public void show()
  4.         {
  5.                 class Inner
  6.                 {
  7.                         public void showIn()
  8.                         {
  9.                         }
  10.                 }
  11.                 Inner i = new Inner();
  12.                 i.showIn();
  13.         }
  14.        
  15. }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
可以啊
如果测试类中想直接访问内部类,格式如下
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
Outer ou =new Outer();
        Outer.Inner ui=ou.new Inner();
ou在 Outer.Inner ui=ou.new Inner(); 是一个外部类的对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马