父類與子類之間靜態函式的呼叫以及函式引數的傳遞

findumars發表於2013-08-09
//: c10:Shapes.java
// From 'Thinking in Java, 3rd ed.' (c) Bruce Eckel 2002
// www.BruceEckel.com. See copyright notice in CopyRight.txt.

class Shape {
    static void g() { System.out.println(" g() in Shape"); }
  void draw() { System.out.println(this + ".draw()"); }
}

class Circle extends Shape {
    static void g() { System.out.println(" g() in Circle"); }
  public String toString() { return "Circle"; }
}

class Square extends Shape {
    static void g() { System.out.println(" g() in Square"); }
  public String toString() { return "Square"; }
}

public class Shapes {

    public void go(Shape s) {
        System.out.println(s);
    }
    public void descendre(Circle c) {
        System.out.println(c);
    }

  public static void main(String[] args) {
    Object[] shapeList = {
      new Circle(),
      new Square(),
    };

    // 例子1. 子類Circle覆蓋父類Shape的靜態函式,但父類指標會呼叫父類的靜態函式。
    System.out.println("==================ex1==================");
    Shape s1 = (Circle)shapeList[0];
    s1.g();
    // 但普通成員函式仍然會呼叫Circle的
    System.out.println(s1);

    // 例子2. 當引數要求是Shape,卻可以直接傳子類Circle的指標而不必做轉換,可編譯直接通過!
// 推論:如果引數是Object,那麼可以不做轉換傳遞任何引數。
System.out.println("==================ex2=================="); Shapes sh = new Shapes(); Circle c1 = new Circle(); sh.go(c1); System.out.println(); // 例子3. 正確:父類指標指向子類,在傳遞父類指標給函式引數時,可正確呼叫子類的函式 System.out.println("==================ex3=================="); Shape sp = new Circle(); sh.go(sp); // 錯誤:sh.descendre(sp); 此時sp仍是Shape型別(即使實際上是Circle),但仍然無法編譯通過。 // sh.descendre(sp); // 正確:做了轉換就可以了 Circle cc = (Circle)sp; sh.descendre(cc); // 正確:同時也可直接呼叫父類指標指向的子類函式。 System.out.println(sp); // 錯誤:但是如果go函式的引數是Square的話(與Circle平起平坐),此時傳遞Circle引數編譯無法通過。 // 例子4,統一使用Shape型別進行動態聯編 System.out.println("==================for=================="); for(int i = 0; i < shapeList.length; i++) { Shape tmp = (Shape)shapeList[i]; tmp.g(); System.out.println(tmp); } // String str=args[0]; // System.out.println(args[1].toString()); } } ///:~

 

相關文章