覆盖重载隐藏遮蔽遮掩

1. override 覆写

    用于实例方法,签名相同,动态分派

    a) 子类方法限定要大于等于父类。即限定变大了。

    b) Never add exception types to the throws clause of a method overridden in a subclass

        也即不能添加更多的异常到子类签名中。可以是父类异常的子类异常,甚至不加异常。所以异常应该是变小了。这主要是为了遵守Liskov OOP 替换原则。子类必须能替换父类,如果子类里有新加的异常,Try/Catch起码要引起变动。相反,子类没有异常并不影响现有的代码。

 

2. Hide 隐藏

 子类属性隐藏父类的,也即父类属性不能继承到子类中(相同名字的话,可以是不同类型)。当然可以通过把子类转型到父类访问父类的属性。这是与覆写不同的地方。

a) 

private 属性根据dynamic type决定

frendly,pretected,public 属性根据static type 决定

静态属性根据类名决定,与类实例无关(即使是static final 类型的子类亦可Hide)

 

3. overload 重载

 父类frendly / pretected / public 方法会继承到子类中,这时父类和子类中相同的方法签名也是overload(重载)。并不是只有定义在一个类中的方法才构成重载。

注意重载哪个方法是在编译时选择的,这与Override非常不同。

 

 4. shadow 遮蔽

变量,方法或类型都有可能

常见的是临时变量遮蔽了类变量或者全局变量。对象方法遮蔽了static import进来的方法。

外围类(enclosing class)包含一个内部类(inner class),内部类(比如继承Thread类)继承的成员方法(比如sleep)遮蔽了外围累(enclosing class)的方法。 

 

5. obscure 遮掩

变量可以遮掩类型,类型可以遮掩包。也即优先级不一样

比如声明一个变量名字为System(非正规的命名),该变量System会obscure Java系统类型System

 

你可能感兴趣的:(thread,oop)