thinking in java 第八章多型 “謎題”
阿新 • • 發佈:2018-12-26
謎題一,缺陷:域,靜態方法(構造器也是靜態方法,不過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 *///:~ //謎題一中已經提到普通方法存在後期繫結機制,但具體實現不得而知。結論如下:一個動態繫結的方法呼叫卻會向外深入到繼承層次結構內部,他可以呼叫匯出類裡的方法