Java内部类深入学习

来源:互联网 发布:linux rm命令详解 编辑:程序博客网 时间:2024/06/04 18:56

一、内部类自动拥有对其外围类的所有成员的访问权。

当某个外围类对象创建了一个内部类对象时,此内部类对象必定会秘密地捕获一个指向那个外围类对象的引用。然后,在你访问此外围了的成员时,就是用那个引用来选择外围类的成员。但是如果内部类是非static的,内部类的对象只能在与其外围类的对象相关联的情况下才会被创建。继承内部类的时候也需要其外围类的对象引用,否则继承无效。

二、.this.new关键字

.this:在内部类中生成对其外围类的引用。一般可以使用外围类的名字后面紧跟圆点和this

如果想告知某些其他对象,去创建某个内部类的对象,必须在new表达式中提供对其他外部类对象的引用,这就需要使用.new语法。例如:

Public class DotNew{}

       Public class Inner{}

}

Public static void main(String args[]){

       DotNew dn=new DotNew();

       DotNew.Inner dni=dn.new Inner();

       //dn.new DotNew.Inner(); 这是错误的

}//在拥有外部了对象之前是不可能创建内部类对象的(非Static内部类)

 

三、内部类可以向上转型(Upcasting)为其基类,或者接口。这时,内部类得到了对接口的引用,能够方便地隐藏实现细节。

四、内部类可以定义在方法和作用域中(需要慢慢地理解)

a)         可以定义在一个方法中

b)        可以定义在作用域中

c)         匿名内部类可以实现一个接口

d)        匿名类可以扩展有非默认构造器的类

e)         匿名类可以执行字段初始化

f)         匿名类可以通过实例初始化实现构造(匿名类不可能有构造器)

五、 嵌套类

如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static普通的内部类自动获取对外围类的引用,而嵌套类具有static的特性,不依赖外围类对象的建立,也没有指向外围类的对象。

1、  要创建嵌套类的对象,不需要外围类的对象;嵌套类中不可以使用this引用;

2、  不能从嵌套类的对象中访问非static的外围类对象;

3、  嵌套类有许多类似static的属性,因为嵌套类本身就是static的,嵌套类可以有static的数据和static字段,还可以包含static的嵌套类,而普通内部类是不可以的。

4、  嵌套类可以作为接口的一部分,而一般情况下,接口内是不允许有任何具体的代码的;

5、  嵌套类可以作为一些公共代码,使得他们可以被某个接口的所有不同实现所共用;

6、  可以使用嵌套类在每个类中都写一个Main()方法,来测试这个类。

7、  在多层嵌套类中,最深层的嵌套类可以透明底访问它所嵌入的外围类的所有成员

六、为什么需要内部类?

每个内部类都能独立地继承自一个(接口)的实现,所以无论外围类是否已经继承了某个(接口的)的实现,对于内部类都没有影响。

普通的类无法实现对抽象类和普通类的多重继承,而采用内部类可以实现,这在有时候是很有用的。内部类使得多重继承的解决方案变得更加完整。接口的实现解决了部分问题,而内部类有效地实现了“多重继承”,即:内部类可以继承非接口类型。

用内部类实现多个接口的意义:

1、  内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立;

2、  在当个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类;

3、  创建内部类对象的时刻并不依赖于外围类对象的创建;

4、  内部类并没有令人迷惑的“is-a”关系,它就是一个独立的类。

原创粉丝点击