网络延迟突然变得很严重,啥游戏都不能玩,郁闷
Chapter 8 Inheritance and Polymorphism
1. 多态(Polymorphism)
针对某个类编写的代码同样适用于它的子类,这个特性称为多态。而具体实现则要JVM在运行时动态地决定,称为动态绑定(dynamic biding)。具体方法是从最特殊化地子类一直搜索到超类,知道找到匹配的类为止。
2. Casting Objects
把一个子类看成它的父类使用一般不会出现什么错误,但把一个父类当成某个子类使用时就需要用到explicit casting,如
Object o = new Student(); //一个Student类也一定符合一个Object类的条件,无需注明
Student b = (Student) o; //如果此时不加以说明o满足Student类的条件就会出错
而要判断o是否满足Student类的条件,可以使用instanceof操作符(由于是操作符,因此字母全部小写)
if (o instanceof Student) { //Statement }
在定义实例的时候,使用它的超类来定义这个实例是一个很好的习惯。这样可以把类似的方法写成一段代码,然后再用instanceof具体判断它是哪个子类的实例,注意判断的时候应从最特殊化的子类开始。
即如果 ClassB extends ClassA, ClassC extends ClassB
static void operate(ClassA test) {
if (test instanceof ClassC) {//...}
else if (test instanceof ClassB) {//...}
else {//...}
由于 . 操作符优先于casting操作符,因此使用casting访问方法时应加上括号
((ClassC)test).method();
3. 数据域的隐藏及静态方法
暂时跳过不看
4. protected 关键字
private, none, protected, public 四个修饰符称为 visiblity modifiers,在UML中依次表示为"-" " " "#" "+",它们的visiblity依次增大。
protected 修饰符允许同一个package以及该类的子类访问该数据/方法。
子类可以覆用(override)父类protected方法,并把它改为public。但是子类不能缩小在父类中定义的方法的使用域,比如父类public方法在子类中只能修饰为public。
5. Object 类另外三个方法
(1) protected void finalize() throws Throwable
析构函数。You should never write the code to invoke it in your program.
(2) protected native Object clone() throws CloneNotSupportedException
native 修饰符意味着该方法并非由Java生成,有可能通过C等访问硬件的语言生成。
复制一个类,注意不用于 newObject = someObject,后者仅仅复制了reference而已。
复制数组时需要casting
int[] targetArray = (int[])sourceArray.clone();
(3)public final native Class getClass()
Object obj = new Object();
Class metaObject = obj.getClass();
System.out.println(metaObject.getName());
显示 java.lang.Object
6. Initialization Blocks
public class Book {
private static int numOfObects;
//...
public Book(int id) { //... }
public Book(String title) { //... }
{
numOfObjects++; //这段代码在所有构造函数被调用前都会执行
}
{
// 如果有多段intialization blocks,按顺序依次执行
}
static {
// static initialization blocks 只能访问静态变量,在类被读入的时候就会执行
}
}
因此,类的构造具体顺序如下:
a. 一个类第一次被使用时,首先读入类,初始化静态数据域,执行static initialization blocks
b. 创建一个类的实例时,有如下三个步骤:
b1. 调用超类的构造函数
b2. 初始化实例数据域,执行instance initialization blocks
b3. 执行构造函数