1. 程式人生 > >Java 面向物件之繼承和重寫OverWrite,重寫和過載的區別,抽象類

Java 面向物件之繼承和重寫OverWrite,重寫和過載的區別,抽象類

01繼承的概述
  A:繼承的概念
    a:繼承描述的是事物之間的所屬關係,通過繼承可以使多種事物之間形成一種關係體系     b:在Java中,類的繼承是指在一個現有類的基礎上去構建一個新的類,構建出來的新類被稱作子類,現有類被稱作父類 B:繼承關係的子類特點 a:子類會自動擁有父類所有非private修飾的屬性和方法 02繼承的定義格式和使用

03繼承的好處
    A:繼承的好處:
        1、繼承的出現提高了程式碼的複用性,提高軟體開發效率。
        2、繼承的出現讓類與類之間產生了關係,提供了多型的前提。

04繼承的注意事項 
  A:繼承的注意事項 
    a:在Java中,類只支援單繼承,不允許多繼承,也就是說一個類只能有一個直接父類,例如下面這種情況是不合法的。
    class A{} 
    class B{}
    class C extends A,B{}  // C類不可以同時繼承A類和B類
     假如支援多繼承例如:
             class A{
             	int a=3;
                public void method(){

                }
             } 
		     class B{
		     	int a=5;
		     	public void method(){

		     	}
		     }
		     class C extends A,B{
                
		     } 
		     class Demo{
		     	public static void main(String[] args){
		     		C c=new C();
		     		System.out.println(c.a);//到底是呼叫A的還是B的成員變數??無法確定
		     		c.method();//到底是呼叫A的還是B的成員方法??無法確定
		     	}	
		     }
  b:多個類可以繼承一個父類,例如下面這種情況是允許的(就像你爹可以多個兒子,但是這些兒子都只有一個爹)
		     class A{}
		     class B extends A{}
		     class C extends A{}   // 類B和類C都可以繼承類A
  c:在Java中,多層繼承是可以的,
	        即一個類的父類可以再去繼承另外的父類,
	        例如C類繼承自B類,而B類又可以去繼承A類,這時,C類也可稱作A類的子類。下面這種情況是允許的。
		     class A{}
		     class B extends A{}   // 類B繼承類A,類B是類A的子類
		     class C extends B{}   // 類C繼承類B,類C是類B的子類,同時也是類A的子類
  d:在Java中,子類和父類是一種相對概念,
            也就是說一個類是某個類父類的同時,也可以是另一個類的子類。
            例如上面的這種情況中,B類是A類的子類,同時又是C類的父類。



05繼承的體系
  A:繼承的體系: 動物(吃) | ------------------------- | | 貓科動物(吃,胎生) 爬行動物(吃,卵生) | | ------------------------------- ----------------- | | | | 貓(吃,抓老鼠,胎生) 虎(吃,領地,胎生) 蛇(吃,冬眠,卵生) 鱷魚(吃,潛水,卵生) a:動物體系是對每個具體事物共性的抽取,子類的共性抽取形成父類 b:父類:具有所有子類的共性內容 子類:不但有共性還有自身特有的內容 c:整個繼承體系,越向上越抽象,越向下越具體
06繼承後子類父類成員變數的特點 
  A:繼承後子類父類成員變數的特點
    a:子類的物件呼叫成員變數的時候,子類自己有,使用子類,子類自己沒有呼叫的父類
    b:當子父類中出現了同名成員變數
    //直接訪問,遵循就近查詢原則
    子父類中出現了同名的成員變數時
    //在子類中需要訪問父類中非私有成員變數時,需要使用super關鍵字
  
07繼承後子類父類成員方法的特性_子類重寫父類方法 
  A:繼承後子類父類成員方法的特性
    a:子類的物件呼叫方法的時候,子類自己有,使用子類,子類自己沒有呼叫的父類
    b:為什麼要有重寫?
    c:子類中出現與父類一模一樣的方法時,會出現覆蓋操作,也稱為override重寫、複寫或者覆蓋
08方法覆蓋的需求 09方法覆蓋的實現 10方法覆蓋的注意事項   A:方法覆蓋的注意事項     a:許可權:子類方法覆蓋父類方法,必須要保證許可權大於等於父類許可權。       四大許可權:public>預設=protected>private     b:方法定義:子類方法和要重寫的父類的方法:方法的方法名和引數列表都要一樣。 關於方法的返回值: 如果是基本資料型別,子類的方法和重寫的父類的方法返回值型別必須相同 如果是引用資料型別,子類的方法和重寫的父類的方法返回值型別可以相同或者子類方法的返回值型別是父類方法返回值型別的子類 class Fu{ int show(){} public Fu method(){} public Fu method2(){}          } class Zi() extends Fu{ public int show(){//返回值為基本型別的重寫} public Fu method(){//子類的方法和重寫的父類的方法返回值型別可以相同} public Zi method2(){//子類方法的返回值型別是父類方法返回值型別的子類} }     c:過載與重寫對比: 過載: 許可權修飾符(public private 預設):無關       方法名:過載的兩個方法的方法名必須相同       形參列表:       形參型別的順序不同       形參的個數不同       形參的型別不同       三者至少滿足一個       返回值型別:過載與返回值型別無關     重寫:       許可權修飾符(public private 預設):       子類方法的許可權>=父類的方法的許可權       方法名:       子類方法和父類方法必須相同       形參列表:       子類方法和父類方法的形參列表必須相同        返回值型別:         基本類資料型別:必須相同         引用資料型別:子類方法的返回值型別和父類方法的返回值型別相同 或者 子類方法的返回值型別是父類方法的返回值型別的 子類 11抽象類的產生 A:抽象類的產生 a:分析事物時,發現了共性內容,就出現向上抽取。會有這樣一種特殊情況,就是方法功能宣告相同,但方法功能主體不同。那麼這時也可以抽取,但只抽取方法宣告,不抽取方法主體。那麼此方法就是一個抽象方法。 12抽象類的定義格式 A:抽象方法定義的格式: a:public abstract 返回值型別 方法名(引數); 抽象類定義的格式: abstract class 類名 { } b:抽象類示例程式碼: /* * 定義類開發工程師類 * EE開發工程師 : 工作 * Android開發工程師 : 工作 * * 根據共性進行抽取,然後形成一個父類Develop * 定義方法,工作: 怎麼工作,具體幹什麼呀 * * 抽象類,不能例項化物件, 不能new的 * 不能建立物件的原因: 如果真的讓你new了, 物件.呼叫抽象方法,抽象方法沒有主體,根本就不能執行 * 抽象類使用: 定義類繼承抽象類,將抽象方法進行重寫,建立子類的物件 */ public abstract class Develop { //定義方法工作方法,但是怎麼工作,說不清楚了,講不明白 //就不說, 方法沒有主體的方法,必須使用關鍵字abstract修飾 //抽象的方法,必須存在於抽象的類中,類也必須用abstract修飾 public abstract void work(); } 13抽象類的使用方式 A:抽象類的使用方式 /* * 定義類,JavaEE的開發人員 * 繼承抽象類Develop,重寫抽象的方法 */ public class JavaEE extends Develop{ //重寫父類的抽象方法 //去掉abstract修飾符,加上方法主體 public void work(){ System.out.println("JavaEE工程師在開發B/S 軟體"); } } /* * 定義Android類,繼承開發人員類 * 重寫抽象方法 */ public class Android extends Develop{ public void work(){ System.out.println("Android工程師開發手機軟體"); } } /* * 測試抽象類 * 建立他的子類的物件,使用子類的物件呼叫方法 */ public class Test { public static void main(String[] args) { JavaEE ee = new JavaEE(); ee.work();//"JavaEE工程師在開發B/S 軟體" Android and = new Android(); and.work();//"Android工程師開發手機軟體" } } 14抽象類特點   A:抽象類的特點     a:抽象類和抽象方法都需要被abstract修飾。抽象方法一定要定義在抽象類中。     b:抽象類不可以直接建立物件,原因:呼叫抽象方法沒有意義。     c:只有覆蓋了抽象類中所有的抽象方法後,其子類才可以建立物件。否則該子類還是一個抽象類。     之所以繼承抽象類,更多的是在思想,是面對共性型別操作會更簡單。 abstract class A{ public abstract void func(); public abstract void func2(); } class A2 extends A{//A2把A中的兩個抽象方法都重寫掉了 //A2類不再是抽象類 public void func(){} public void func2(){} } abstract class A3 extends A{//含有抽象方法的類一定是抽象類 public void func(){ } //public abstract void func2();//func2相當於被繼承下來 } 15抽象類的設計思想 A:抽象類的設計思想 a:抽象類的作用:繼承的體系抽象類,強制子類重寫抽象的方法 抽象員工: 規定一個方法,work工作 EE員工,Android員工 Develop類 抽象類 abstract work(); | ------------- | | EE Android //是我開發的一員必須工作 work(){} work(){} 16抽象類的細節 A:抽象類的細節 a:抽象類一定是個父類? 是的,因為不斷抽取而來的。 b:抽象類中是否可以不定義抽象方法? 是可以的,那這個抽象類的存在到底有什麼意義呢?不讓該類建立物件,方法可以直接讓子類去使用 (介面卡設計模式) /* * 抽象類,可以沒有抽象方法,可以定義帶有方法體的方法 * 讓子類繼承後,可以直接使用 */ public abstract class Animal { public void sleep(){ System.out.println("動物睡覺"); } } public class Cat extends Animal{ } public class Test { public static void main(String[] args) { //Cat c = new Cat(); new Cat().sleep();//不讓該類建立物件,方法可以直接讓子類去使用 } } c:抽象關鍵字abstract不可以和哪些關鍵字共存? 1:private:私有的方法子類是無法繼承到的,也不存在覆蓋, 而abstract和private一起使用修飾方法,abstract既要子類去實現這個方法, 而private修飾子類根本無法得到父類這個方法。互相矛盾。 /* * 抽象類,可以沒有抽象方法,可以定義帶有方法體的方法 * 讓子類繼承後,可以直接使用 */ public abstract class Animal { // private abstract void show(); //抽象方法,需要子類重寫, 如果父類方法是私有的,子類繼承不了,也就沒有了重寫 }