1. 程式人生 > >Java筆記丨17 多型及虛方法的呼叫

Java筆記丨17 多型及虛方法的呼叫

多型

多型是指一個程式中相同的名字表示不同的含義情況

多型有兩種情形

    編譯時多型:

        過載(多個同名的不同方法)

        如:p.sayHello(); p.sayHello(“Wang”);

    執行時多型:

        覆蓋(子類對父類的方法過載)

動態繫結——虛方法呼叫

在呼叫方法時,程式會正確地呼叫子類物件的方法

多型的特點大大提高了程式的抽象程度和簡潔性

 

上溯造型

把派生型別當做基本型別處理

Person p=new Student();

void fun(Person p){…} fun(new Person());

 

虛方法呼叫

用虛方法呼叫,可以實現執行時的多型

子類過載了父類的方法時,執行時

系統根據呼叫該方法的例項型別來決定使用哪個方法呼叫

所有的非final方法都會自動地進行動態繫結

示例:TestVirtualInvoke.java

class TestVirtualInvoke

{

       static void doStuff( Shape s ){

              s.draw();

       }



       public static void main( String [] args ){

              Circle c = new Circle();

              Triangle t = new Triangle();

              Line l = new Line();

              doStuff(c);

              doStuff(t);

              doStuff(l);

       }

}

class Shape

{

       void draw(){ System.out.println("Shape Drawing"); }

}

class Circle extends Shape

{

       void draw(){ System.out.println("Draw Circle"); }

}



class Triangle extends Shape

{

       void draw(){ System.out.println("Draw Three Lines"); }

}



class Line extends Shape

{

       void draw(){ System.out.println("Draw Line"); }

}

動態型別確定

變數instanceof型別

結果是boolean值

示例:InstanceOf.java

class InstanceOf

{

       public static void main(String[] args)

       {

              Object [] things = new Object[3];

              things[0] = new Integer(4);

              things[1] = new Double(3.14);

              things[2] = new String("2.09");

              double s = 0;

              for( int i=0; i<things.length; i++ ){

                     if( things[i] instanceof Integer )

                            s += ((Integer)things[i]).intValue();

                     else if( things[i] instanceof Double )

                            s += ((Double)things[i]).doubleValue();

              }

              System.out.println("sum=" + s);

       }

}

三種非虛的方法

Java中,普通的方法是虛方法

static,private與虛方法編譯後用的指令是不同的

static的方法,以宣告的型別為準,與例項型別無關

private方法子類看不見,也不會被虛化

final方法子類不能覆蓋,不存在虛化問題

對比TestStaticInvoke.java

class TestStaticInvoke

{

       static void doStuff( Shape s ){

              s.draw();

       }

       public static void main( String [] args ){

              Circle c = new Circle();

              Triangle t = new Triangle();

              Line l = new Line();

              doStuff(c);

              doStuff(t);

              doStuff(l);

             

              Shape s = new Circle();

              doStuff(s);

              s.draw();

             

              Circle c2 = new Circle();

              c2.draw();

       }

}

class Shape

{

       static void draw(){ System.out.println("Shape Drawing"); }

}

class Circle extends Shape

{

       static void draw(){ System.out.println("Draw Circle"); }

}



class Triangle extends Shape

{

       static void draw(){ System.out.println("Draw Three Lines"); }

}



class Line extends Shape

{

       static void draw(){ System.out.println("Draw Line"); }

}

結果:

Shape Drawing

Shape Drawing

Shape Drawing

Shape Drawing

Shape Drawing

Draw Circle