1. 程式人生 > >thinking in java 第八章多型 “謎題”

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
*///:~
//謎題一中已經提到普通方法存在後期繫結機制,但具體實現不得而知。結論如下:一個動態繫結的方法呼叫卻會向外深入到繼承層次結構內部,他可以呼叫匯出類裡的方法