1. 程式人生 > >java筆記-9

java筆記-9

多型
前提:要有繼承關係
要有方法重寫
要有父類引用指向子類物件
多型中成員訪問特點:

  1. 成員變數 : 編譯看左邊 執行看左邊
  2. 成員方法 :編譯看左邊 執行看右邊
  3. 靜態方法 : 編譯看左邊 執行看左邊(靜態和類相關,算不上重寫所以訪問還是左邊的)
    只有非靜態的成員方法,編譯看左邊,執行看右邊
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 :非抽象方法 子類繼承的事情,提高程式碼複用性。

介面

  1. 介面特點 :
  • [ ]介面用關鍵字interface 表示 :interface 介面名{}
  • 類實現介面用implements
  • 介面用多型的方式實現例項化
  • 介面的子類可以是抽象類也可以是具體類
  1. 介面成員特點:
  • 成員變數:只能是常量並且是靜態的公共的
    預設修飾符:public static final

  • 構造方法: 介面沒有構造方法

  • 成員方法:只能是抽象方法,預設修飾符 public abstract

  1. 類與類 類與介面 介面與介面的關係
  • 類與類:繼承關係,只能單繼承,可以多層繼承
  • 類與介面:可以單實現,可以多實現 可以在繼承一個類的同時實現多個介面
  • 介面與介面:可以單繼承,可以多繼承
  1. 抽象類與介面的區別
  • 成員區別:
  • 1 抽象類:成員變數可以是變數 可以是常量 ,構造方法有,成員方法可以抽象可以非抽象
  • 2 介面:成員變數只能是常量,成員方法只能是抽象
  • 關係區別
  • [ 1] 類與類 :繼承,單繼承
  • 2 類與介面:實現 單實現,多實現
  • 3 介面與介面:繼承,單繼承,多繼承
  • 設計理念區別
    -抽象類 被繼承體現的是“is a”的關係,定義的是該繼承體系的共性功能
    介面 被實現體系的是“like a”的關係 ,定義的是該繼承體系的擴充套件功能
  1. 匿名內部類: new 類名或介面名 (){ 重寫方法;} 只針對重寫一個方法,不能向下轉型 因為沒有子類類名
    匿名內部類當做引數傳遞(本質吧匿名內部類看做一個物件)