为什么使用内部类:可实现“多重继承”
1、在某一外围类里定义,可以在一个方法里面或者在任意的作用域内定义内部类。
2、如果想在外部类的非静态方法之外的任意位置创建某个内部类的对象,需要具体指明这个对象的类型,OuterClassName.InnerClassName
3、需要创建内部类(非static类)的对象时,需用外部类对象来创建,即需先创建一个外部类对象.如
OuterClassName a= new OuterClassName();
OuterClassName.InnerClassName b=a.new InnerClassName();
4、当生能一个内部类对象时,这个对象就能访问其外围对象的所有成员而不需要其他任何条件,此外,内部类也拥有了其外围类的所有元素访问权。
5、如果要生成对外部类对象的引用,可以用外部类名紧跟圆点和this(.this)。
6、内部类属于外部类的成员,故可以用private关键字修饰,被private修饰后,在其他类中则不能通过外部类对象来直接.new内部类对象。要定义方法来获取。
7、匿名内部类:(匿名内部类必须写在方法里,因为它其实是一段特殊的执行语句)
①在外部类方法中,方法的返回值类的对象生成与类的定义结合在一起,但是类是没有名字的:return new ClassName(){........};注意这是一个语句,后面分号不能掉。意思是创建一个继承自ClassName的匿名类对象,其返回的引用会自动被向上转型为其父类ClassName。
②上面使用了默认构造器ClassName()创建了对象,当ClassName中构造器需要传入参数,只需将适合的参数传入即可,如return new ClassName(x){.......};
③匿名类中定义字段时还能用来对其进行初始化。
④匿名内部类如果需要使用一个在其外部定义的参数(比如其外部方法中传入的参数),那么这个参数必需是final的。如果匿名内部类中从未使用过,则可以不是final的。
⑤匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但是不能两都兼备,而且如果是实现接口,也只能实现一个接口!
8、内部类与工厂设计模式:(后续理解再写)
9、嵌套类:如果不需要内部类对象与其外部类对象之间有联系,则可声明内部类为static
普通的内部类对象,隐式地保存了一个引用指向创建它的外部类。但static修饰后则不是这样了:①要创建嵌套类对象,不再需要其外部类的对象了。②不能从嵌套类的对象中访问非静态的外部类对象。
嵌套类与普通内部类还有区别:普通内部类的字段和方法只能放在类的外部层次上,所以普通内部类不能有static字段和static方法,也不能包含嵌套类。而嵌套类可以包含所有这些东西。
10、接口内部的类:默认为static类。还可实现外围接口。如果想要创建某些公共代码,使得它们能被某个接口的所有的不同实现所共用,这样就可以使用接口内部的嵌套类。