谜题一,缺陷:域,静态方法(构造器也是静态方法,不过static声明是隐式的),“覆盖”私有方法
public class Shape {
public int r = 1;
public int getR() {
return r;
}
public static void main(String args[]) {
Shape s = new Circle();
System.out.println(s.r);
System.out.println(s.getR());
}/*output:
1
2
*///:~
}
class Circle extends Shape {
public int r = 2;
@Override
public int getR() {
return r;
}
}
//在本例中,为Shape.r和Circle.r分配了不同的存储空间,Circle实际上包含俩个为r的域(通常只有一个,因为是private),一个是自己的,一个是shape的。域的解析是编译器解析的,不具有多态性。普通方法有后期绑定机制(能判断对象的类型),不同编程语言的方法也不同。静态方法是与类,并非与单一对象关联。所以,也不具有多态性。
//谜题二.8.3.3构造器内部的多态方法行为
import static com.luobo.util.Print.println;
/**
* Description:
* Date: 2018/12/25 16:20
*
* @author: Y.U.
* @version: 1.0
*/
class Glyph{
void draw(){println("Glyph.draw()");}
Glyph() {
println("Glyph() before draw()");
draw();
println("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph (int r) {
radius = r;
println("RoundGlyph.RoundGlyph(),radius = " + radius);
}
void draw() {
println("RoundGlyph.draw(),radius = " + radius);
}
}
public class PloyConstructors {
public static void main(String args[]) {
new RoundGlyph(5);
}
}/*output:
Glyph() before draw()
RoundGlyph.draw(),radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(),radius = 5
*///:~
//谜题一中已经提到普通方法存在后期绑定机制,但具体实现不得而知。结论如下:一个动态绑定的方法调用却会向外深入到继承层次结构内部,他可以调用导出类里的方法