轉載請標明出處:http://blog.csdn.net/wu_wxc/article/details/51463306
本文出自【吳孝城的CSDN博客】
一個行爲具有多種表現形式稱爲多態
如吹奏樂器,吹笛子和吹簫聲音是不同的,同樣是吹這個動作,作用在不同對象上產生不同的效果,這就是多態。吹這個動作的多態。
Java的引用變量有兩個類型,編譯時類型和運行時類型。
編譯時類型由聲明該變量時使用的類型決定,運行時類型由實際賦給該變量的類型決定,如果編輯時類型和運行時類型不一致,就可能出現多態。
多態的體現
方法的重載和重寫
對象的多態性
如類A,類B
其中
B extends A
那麼向上轉型
A a = new B();
可以通過a調用父類方法,如果父類方法被重寫,將調用重寫後的方法
向下轉型要先向上轉型,再向下轉型
A a = new B();
B b = (B)a;
可以通過b調用子類的方法,父類的方法,(因爲子類繼承父類,享有父類方法)
引用類型轉換
1、向上類型轉換(隱式/自動類型轉換),由小類型轉向大類型
2、向下類型轉換(強制類型轉換),由大類型轉向小類型
3、instanceof運算符,用來解決類型轉換的安全性問題
例子
package cn.wuxiaocheng;
class A {
public void priA1() {
System.out.println("priA1");
}
public void priA2() {
System.err.println("priA2");
}
}
class B extends A {
// 重寫父類的priA1()方法
public void priA1() {
System.out.println("重寫priA1");
}
public void priB() {
System.out.println("priB");
}
}
public class Test {
public static void main(String[] args) {
// 向上轉型
A a = new B();
a.priA1();
a.priA2();
}
}
package cn.wuxiaocheng;
class A {
public void priA1() {
System.out.println("priA1");
}
public void priA2() {
System.err.println("priA2");
}
}
class B extends A {
// 重寫父類的priA1()方法
public void priA1() {
System.out.println("重寫priA1");
}
public void priB() {
System.out.println("priB");
}
}
public class Test {
public static void main(String[] args) {
// 向下轉型要先向上轉型,再向下轉型
A a2 = new B();
B b = (B)a2;
b.priA1();
b.priA2();
b.priB();
}
}
當在進行類型轉換時,如果類型不匹配時會出現異常,可以用instanceof來用避免類型轉換時的安全性問題
package cn.wuxiaocheng;
class A {
public void priA1() {
System.out.println("priA1");
}
public void priA2() {
System.err.println("priA2");
}
}
class B extends A {
// 重寫父類的priA1()方法
public void priA1() {
System.out.println("重寫priA1");
}
public void priB() {
System.out.println("priB");
}
}
public class Test {
public static void main(String[] args) {
A a1 = new A();
System.out.println(a1 instanceof A);
System.out.println(a1 instanceof B);
A a2 = new B();
System.out.println(a2 instanceof A);
System.out.println(a2 instanceof B);
}
}