Java筆記丨17 多型及虛方法的呼叫
阿新 • • 發佈:2018-12-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