java关于变量/方法覆盖

Author Avatar
Aryb1n 7月 13, 2016
  1. 先看变量的覆盖(遮盖)

class InterCalculator {
    int sum;
    ...
}

class DecimalCalculator extends InterCalculator {
    double sum;
    ...
}

当由一个派生层次更高的类型(父类)来引用一个子类对象,那么被遮蔽的对象会怎样呢

DecimalCalculator dc = new DecimalCalculator();
InterCalculator ic = dc;

int s = ic.num; //access InterCalculator sum

// 如果我们访问的对象使用到了InterCalculator类型的显示类型转换或者我们把一个实例传递给接受父类类型的方法,也会是这种情况
  1. 而类似的方法的覆盖,我一直叫 方法的重写 (override)
class Animal {
    void sleep() {
        ...
    }
    ...
}

class Mammal extends Animal {
    // override the method sleep
    void sleep() {
        ...
    }
    ...
}

class Cat extends Mammal {
    // override the method sleep
    void sleep() {

    }
}

类似上面, 当由一个派生层次更高的类型(父类)来引用一个子类对象,那么被遮蔽的对象会怎样呢

Cat simon = new Cat();
Animal creature = simon;
...
creature.sleep();   // access Cat sleep

方法的override与前面的变量的遮蔽不太一样

从行为来看,Cat就是一个Cat,不管你怎么叫他,而其他时候creature更像一个Animal。要通过Animal引用访问一个被遮蔽的变量,则会找到Animal类的实现,而不是Cat。