java筆記-9
阿新 • • 發佈:2019-01-09
多型
前提:要有繼承關係
要有方法重寫
要有父類引用指向子類物件
多型中成員訪問特點:
- 成員變數 : 編譯看左邊 執行看左邊
- 成員方法 :編譯看左邊 執行看右邊
- 靜態方法 : 編譯看左邊 執行看左邊(靜態和類相關,算不上重寫所以訪問還是左邊的)
只有非靜態的成員方法,編譯看左邊,執行看右邊
public class duotai { public static void main(String[] args) { // TODO Auto-generated method stub Father f =new Son();//父類引用指向子類物件 System.out.println(f.num); //輸出值10 成員變數: 編譯看左邊(父類)執行看右邊(子類) Son s =new Son(); System.out.println(s.num);//輸出值 20 } } class Father{ int num=10; } class Son extends Father{ int num =20; }
原理圖:
public class duotai { public static void main(String[] args) { // TODO Auto-generated method stub Father f =new Son();//父類引用指向子類物件 f.print(); //輸出值 son 編譯看左邊,執行看右邊(子類) 動態繫結 } } class Father{ int num=10; public void print(){ System.out.println("father"); } } class Son extends Father{ int num =20; public void print(){ System.out.println("son"); } }
原理圖:
public class duotai { public static void main(String[] args) { // TODO Auto-generated method stub Father f =new Son();//父類引用指向子類物件 f.method(); //輸出值 Father static method 編譯看左邊,執行看左邊(子類) 動態繫結 } } class Father{ int num=10; public void print(){ System.out.println("father"); } public static void method(){ System.out.println("Father static method"); } } class Son extends Father{ int num =20; public void print(){ System.out.println("son"); } public static void method(){ System.out.println("son static method"); } }
資料型別提升
int i=10;
byte b =20;
i=b;//自動型別提升
b=(byte)i;//強制型別轉換
父類引用指向子類物件就是向上轉型: Person p =new SuperMan()
向下轉型: SuperMan sm=(SuperMan) p
多型優缺
優:提高了程式碼的維護性(繼承保證)
提到了程式碼的可擴充套件性(多型保證)
缺: 不能使用子類特有屬性和行為
題目分析
public class duotai2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Fu f=new Zi();
f.method();
f.show();
}
}
class Fu{
public void show(){
System.out.println("fu show");
}
}
class Zi extends Fu {
public void show(){
System.out.println("zi show");
}
public void mehtod(){
System.out.println("zi method");
}
}
f.method() 程式會報錯,找不到方法
f.show() 輸出 “zi show ” 如果將zi 中show()註釋則將呼叫父類 輸出“fu show”
題二:
public class duotai3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
A a =new B();
//a.show(); //輸出“愛”
B b =new C();
b.show(); //輸出“你”
}
}
class A{
public void show(){
show2();
}
public void show2(){
System.out.println("我");
}
}
class B extends A{
public void show2(){
System.out.println("愛");
}
}
class C extends B{
public void show(){
super.show();
}
public void show2(){
System.out.println("你");
}
}
抽象類
1 抽象類特點:
抽象類和抽象方法必須用abstract修飾,
abstract class 類名{}
public abstract void eat();
抽象類不一定有抽象方法,有抽象方法的類一定是抽象類或者介面
抽象類不能例項化,所以,由具體的子類例項化。
抽象類的子類:要麼是抽象類要麼重寫抽象類的所有抽象方法
2 抽象的成員特點
成員變數:既可以是變數,也可以是常量。
abstract是否可以修飾成員變數? : 不能修飾成員變數
構造方法:有 用於子類訪問父類資料的初始化
成員方法:既可以是抽象的,也可以是非抽象的
抽象類的成員方法特性:
a :抽象方法 強制要求子類做的事情
b :非抽象方法 子類繼承的事情,提高程式碼複用性。
介面
- 介面特點 :
- [ ]介面用關鍵字interface 表示 :interface 介面名{}
- 類實現介面用implements
- 介面用多型的方式實現例項化
- 介面的子類可以是抽象類也可以是具體類
- 介面成員特點:
-
成員變數:只能是常量並且是靜態的公共的
預設修飾符:public static final -
構造方法: 介面沒有構造方法
-
成員方法:只能是抽象方法,預設修飾符 public abstract
- 類與類 類與介面 介面與介面的關係
- 類與類:繼承關係,只能單繼承,可以多層繼承
- 類與介面:可以單實現,可以多實現 可以在繼承一個類的同時實現多個介面
- 介面與介面:可以單繼承,可以多繼承
- 抽象類與介面的區別
- 成員區別:
- 1 抽象類:成員變數可以是變數 可以是常量 ,構造方法有,成員方法可以抽象可以非抽象
- 2 介面:成員變數只能是常量,成員方法只能是抽象
- 關係區別
- [ 1] 類與類 :繼承,單繼承
- 2 類與介面:實現 單實現,多實現
- 3 介面與介面:繼承,單繼承,多繼承
- 設計理念區別
-抽象類 被繼承體現的是“is a”的關係,定義的是該繼承體系的共性功能
介面 被實現體系的是“like a”的關係 ,定義的是該繼承體系的擴充套件功能
- 匿名內部類: new 類名或介面名 (){ 重寫方法;} 只針對重寫一個方法,不能向下轉型 因為沒有子類類名
匿名內部類當做引數傳遞(本質吧匿名內部類看做一個物件)