内部类
1:内部类是一种代码隐藏机制,它了解外围类,并能与之通信。
2:它能访问其外围类对象的所有成员,而不需要任何条件,内部类拥有其外围类的所有元素访问权。
3:有时你可能要告诉某些其他对象,去创建某个内部类的对象,要实现次目的,你必须在new表达式中提供其他外部类对象的引用,如:
class Outer
{
class Inner {}
public static void main(String[] args)
{
Outer o = new Outer();
Inner i = o.new Inner();
}
}
但是,如果你创建的是嵌套类(静态内部类),那么就不需要对外部类对象的引用,如:
class Outer
{
static class Inner {}
}
class Test
{
public static void main(String[] args)
{
Outer.Inner in = new Outer.Inner();
}
}
4:当内部类向上转型位基类时,尤其是转型位一个接口是,内部类就有了用武之地(不太懂),这是应为内部类能够完全看不见,并完全不可用。虽有得到的只是指向某基类或接口的应用,所以可以很方便地隐藏实现细节。
5:如果定义一个匿名内部类,并希望他使用一个在其外部定义的对象(外部定义?),那么编译器会要求其参数的引用是final的,如果想做一些类似构造的行为,可以通过实例初始化完成。匿名内部类与正规内部类的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但是两者不能兼备,而且如果实现接口也只能实现一个。
6:嵌套类,声明位static的内部类。普通内部类对象隐式地保存了一个引用,指向创建它的外部类对象,而但内部类是static时,就不是这样了:
要创建嵌套类的对象,并不需要其外围类对象。
不能从嵌套类的对象中访问非静态的外围类对象。
普通内部类的字段与方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类,但嵌套类可以有这些东西。
7:一个内部类(不是嵌套类)被嵌套多少层并不重要,他能透明的访问所有它所嵌入的外围类的所有成员。
8:内部类实现一个接口与我外围类实现这个接口有什么区别呢?答案是:后者不是总能享用到接口带来的方便,有时需要用到接口的实现,内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了(某个接口的)实现,对内部类都没有影响,内部类使得多重继承的解决方案变得完整。
9:使用内部类可以获得其他一些特性:
内部类可以有多个实例,每个实例都有自己的状态信息,并且与其外围类对象的信息相互独立。
在单个外围类中,可以让多个内部类已不同的方式实现同一接口,或继承同一个类。
创建内部类对象的时刻并不依赖与外围类对象的创建。
内部类并没有令人迷惑的“is-a”关系,它就是一个独立的实体。
抄自《Java编程思想 第4版》
 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号