1625-5 王子昂 总结《2017年3月8日》 【连续第158天总结】
A.Java 接口与内部类
B.内部类是定义在另一个类中的类。使用它的原因有三点:
内部类的方法可以访问所在类的作用域中的数据,包括私有的。
内部类可以对同一个包中的其他类隐藏起来
当想要定义一个回调函数时且不想编写大量代码时,使用匿名内部类比较便捷
C++中有嵌套类,即把一个类作为另一个类的成员
嵌套类有两个好处:命名控制和访问控制
命名控制表示内部类不会与外部的同名类混淆
访问控制表示可以将内部类设为私有,内部类的成员设为公有;这样外部类以外的其他类无法访问内部类,而外部类的方法却可以
Java中还有另一个好处:内部类的对象有一个隐式引用--实例化该内部类对象的外部类对象。这样就可以让内部类来操作外部类的状态
内部类对于外部类的实例域可以自动引用,而不需要显式写出外部类的名字
eg:if(beep){}等价于 if(out.beep){}
注意:在类中声明的内部类不会自动生成对象,需要在外部类的方法中使用new操作符构造一个内部类的对象才行;因为内部类是private的,因此除了所属的外部类以外是不能构造内部类对象的
内部类对于虚拟机而言是不存在的,编译器在对待内部类时会把它编译成一个名字特殊(外部类+$+内部类)的常规类。在外部类中拥有一个实例域this$0来代表内部类。
但如果显式创建一个类,并把另外一个类的this指针传递给它(引用变量传入),是不能访问另一个类的private域的。因此内部类拥有更强大的访问权限。
实际上,编译器还为外部类创建了一个方法access$0(名字取决于编译器)来访问private域。
*因此,对于别有用心的人,可以通过十六进制编辑器轻松创建一个用虚拟机指令调用access$0方法的文件,来访问到一个类的private域。
内部类还有更加隐蔽的方式:局部内部类。
在方法内部声明内部类,这样不需要用Public或private访问说明符进行声明。作用域被限定在声明这个局部类的块中。也就是说,外部类的其他方法也是不能访问内部类的。
局部类可以访问局部变量,不过必须声明为final。实际上,由于局部类往往慢于所属外部类的方法的结束,因此这个局部变量是用来备份的。声明为final也是为了拷贝和变量一致。但是有一种方法来回避final的只可初始化一次特性:使用一个长度为1的数组:数组是不可变对象,因此它的地址不变,则final变量时不变的。但是数组内的元素是可以改变的。
当只需要一个内部类的对象时,可以使用匿名内部类:原来类名的地方使用接口或者超类的名字。在构造的时候把构造器参数传给超类构造器。
如果内部类只是为了隐藏,不需要访问外部类的域时,可以使用static声明符,这样就可以取消产生的引用。
代理(proxy)可以在运行时创建一个实现了一组给定接口的新类。这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用。
C.明日计划
JAVA再往后就是图形化了,既然我的初衷就是安卓,那就直接跳过好了。下一步选读,目标是异常和集合。
考虑安卓教程,准备进入。