黑马程序员技术交流社区

标题: 几种内部类用法和区别 [打印本页]

作者: 胡进辉    时间: 2012-8-21 12:34
标题: 几种内部类用法和区别
对内部类比较迷茫,望告知
作者: 刘芮铭    时间: 2012-8-21 12:46
按所在位置不同,可以分为两大类
1、   在类方法中-
特点:
        A、可以访问宿主类的所有元素
        B、保存宿主类对象的引用,创建对象时必须有宿主类对象
        C、不能有静态数据
细分:
        1)本地内部类
        2)匿名内部类
            1)2)的区别在于1)有构造函数,而2)只能实例初始化


2、   在类或接口作用域中-
特点:
        A、只能访问宿主类的静态元素
        B、创建对象时和宿主类对象无关
        C、可有静态数据

细分:
      1)普通内部类
      2)静态内部类

作者: 李知伦    时间: 2012-8-21 12:46
内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中,如下所示:
public class Outer
{
                int out_x  = 0;
                public void method()
                {
                        Inner1 inner1 = new Inner1();
                        public class Inner2   //在方法体内部定义的内部类
                        {
                                public method()
                                {
                                        out_x = 3;
                                }
                        }
                        Inner2 inner2 = new Inner2();
                }

                public class Inner1   //在方法体外面定义的内部类
                {
                }
               
}
在方法体外面定义的内部类的访问类型可以是public,protecte,默认的,private等4种类型,这就好像类中定义的成员变量有4种访问类型一样,它们决定这个内部类的定义对其他类是否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象,代码如下:
Outer outer = new Outer();
Outer.Inner1 inner1 = outer.new Innner1();

在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final或abstract修饰符。这种内部类对其他类是不可见的其他类无法引用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须先定义后使用的道理也是一样的。这种内部类可以访问方法体中的局部变量,但是,该局部变量前必须加final修饰符。
对于这些细节,只要在eclipse写代码试试,根据开发工具提示的各类错误信息就可以马上了解到。

在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或类的子类的同时,还创建了该子类的实例对象,无需为该子类定义名称:
public class Outer
{
                public void start()
                {
                        new Thread(
new Runable(){
                                        public void run(){};
}
).start();
                }
}

最后,在方法外部定义的内部类前面可以加上static关键字,从而成为Static Nested Class,它不再具有内部类的特性,所有,从狭义上讲,它不是内部类。Static Nested Class与普通类在运行时的行为和功能上没有什么区别,只是在编程引用时的语法上有一些差别,它可以定义成public、protected、默认的、private等多种类型,而普通类只能定义成public和默认的这两种类型。在外面引用Static Nested Class类的名称为“外部类名.内部类名”。在外面不需要创建外部类的实例对象,就可以直接创建Static Nested Class,例如,假设Inner是定义在Outer类中的Static Nested Class,那么可以使用如下语句创建Inner类:
Outer.Inner inner = new Outer.Inner();
由于static Nested Class不依赖于外部类的实例对象,所以,static Nested Class能访问外部类的非static成员变量。当在外部类中访问Static Nested Class时,可以直接使用Static Nested Class的名字,而不需要加上外部类的名字了,在Static Nested Class中也可以直接引用外部类的static的成员变量,不需要加上外部类的名字。
在静态方法中定义的内部类也是Static Nested Class,这时候不能在类前面加static关键字,静态方法中的Static Nested Class与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的static的成员变量,还可以访问静态方法中的局部变量,但是,该局部变量前必须加final修饰符。

备注:首先根据你的印象说出你对内部类的总体方面的特点:例如,在两个地方可以定义,可以访问外部类的成员变量,不能定义静态成员,这是大的特点。然后再说一些细节方面的知识,例如,几种定义方式的语法区别,静态内部类,以及匿名内部类。

内部类可以引用它的包含类的成员.如果你把静态嵌套类当作内部类的一种特例,那在这种情况下不可以访问外部类的普通成员变量,而只能访问外部类中的静态成员,例如,下面的代码:
class Outer
{
        static int x;
        static class Inner
        {
                void test()
                {
                        syso(x);
                }
        }
}


Anonymous Inner Class (匿名内部类) 可以extends(继承)其它类,可以implements(实现)interface(接口)而且是必须!

作者: 杨鹏鹏    时间: 2012-8-21 12:53
内部类(Inner Class),内部类共分为4种。
2. 静态内部类(static inner class):只能访问外部类的静态成员变量与静态方法,生成静态内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass.InnerClass();
3. 成员内部类(member inner class):可以访问外部类的静态与非静态的方法与成员变量。生成成员内部类对象的方式为:
OuterClass.InnerClass inner = new OuterClass().new InnerClass();
4. 若想在局部内部类中访问外部类的成员变量,语法为:OuterClass.this.a;
5. 局部内部类(Local Inner Class):定义在方法当中,只能访问方法中声明的final类型的变量。
6. 匿名内部类(Anonymous Inner Class):匿名内部类会隐式地继承一个父类或实现一个接口。




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