1:内部类将一些逻辑相关的类组织到一起。
2:是一种代码隐藏机制,可以访问外部类的成员,并与之通信。
3:经典的用法外部类中含有一个返回内部类的引用。
4:在内部类中获取外部类的引用:外部类类名.this例如:(OutClass.this)。{可以在内部类中写一个方法用这种方法返回它的外部类的引用}
5:在外部类之外的其他类创建内部类的对象:OutClass.InnerClass obj = OutClass对象.new InnerClass();因此在外部类创建之前,内部类无法创建(静态内部类除外)。
6: protected本类、子类、本包中可以访问。
7:要在某一个作用域内部解决一个繁琐的问题,需要创建一个类但是不希望被别的作用域访问。
8:匿名内部类返回一个接口的引用,该接口的继承实现类的类体在此处定义了出来。
9:如果希望在匿名内部类中使用外部定义的对象,那么编译器会要求改参数是final的。
10:由于匿名内部类没有类名,所以不会有构造器。通过实例初始化可以达到类似的效果。如下例:
abstract class Base{
public Base(int i){
println("abstractClass"+"i");
}
}
public class OuterClass{
public static Base getBase(int i){
return new Base(i){ //这里这个i没有被匿名内部类直接使用所以不需要被final修饰。
println("innerClass"+""i");
}
}
}
11:匿名内部类可以扩展类也可以实现接口但是两者不能兼备,而如果实现接口也只能是一个。
12:如果希望内部类不需要和他的外部类有联系。可以使用static修饰内部类使其成为嵌套类。
13:普通内部类实际上保存了一个它的外部类的引用,但是嵌套类没有。(嵌套类的创建不需要外部类,嵌套类不能访问外部类的非静态成员)
14:接口内部的类(因为接口中的成员都是public static的,所以接口中的内部类都是嵌套类,因为接口和嵌套类都是static的所以嵌套类只是放到了接口的命名空间,这并不违反接口的规则。)
15:如果希望接口中某一段代码需要被所有实现类共用,可以使用接口内部类实现。
16:接口解决了部分多继承的问题,而内部类有效的完善了java不能多继承的缺陷。(内部类的出现可以使外部类间接的继承多个非接口的类)。
17:闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。(内部类就是java的闭包)
18:内部类的继承,由于内部类隐士的包含了一个外部类的引用,创建内部类时也需要提前创建外部类的实例。
继承内部类的时候需要使用特殊的语法指明其中的联系。例如:
Class OutClass{
Class InnerClass{}
}
pbulic class Inner extends OutClass.InnerClass{
Inner(OutClass outClass){
outClass.super(); //使用构造方法接收一个外部类的引用然后执行:enclosingClassReference.super();
}
}
//参考:http://blog.csdn.net/FeeLang/article/details/39403027
19:局部内部类:在代码块里创建内部类,典型的是在方法内创建内部类,该类可以访问当前代码块中的常量和外部类的所有成员。
20:局部内部类和匿名内部类:既然局部内部类不能被外不访问,为什么不用匿名内部类呢?因为匿名内部类只能有一个实例,局部内部类可以有多个。
21:内部类标识符:每一个类都会产生一个.class文件,内部类也不例外,文件名的格式为:外部类名$内部类名。如果内部类有嵌套则继续使用$连接。匿名内部类会简单的产生一个数字作为标识。