thinking in java 第八章多态 “谜题”

谜题一,缺陷:域,静态方法(构造器也是静态方法,不过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
*///:~
//谜题一中已经提到普通方法存在后期绑定机制,但具体实现不得而知。结论如下:一个动态绑定的方法调用却会向外深入到继承层次结构内部,他可以调用导出类里的方法

猜你喜欢

转载自blog.csdn.net/weixin_43842590/article/details/85250158