Java學習之面向對象三


1、多態是什么,多態的前提條件是什么?

     多態就是父類引用變量指向子類對象;

     前提條件:必須有子父類關系或類實現接口關系;

2、多態中成員訪問的特點分別是什么?
     成員變量:

      當子父類中出現同名的成員變量,多態調用該變量時,

       編譯時期:參考的是引用變量所屬的類中是否有被調用的成員變量。沒有編譯失敗;

      運行時期:也是調用引用型變量所屬的類中的成員變量;

      簡單記:運行編譯看左邊。
   成員方法(非靜態方法)

       編譯時期:參考引用變量所屬的類,如果沒有類中調用的方法,便以失敗;

      運行時期:參考引用變量所指的對象所屬的類,並運行對象所屬類中的方法;

      簡單記:編譯看左邊,運行看右邊。
     靜態方法

     編譯時期:參考引用變量所屬的類中是否有調用的靜態方法;

     運行時期:參考引用變量所屬的類中是否有調用的靜態方法;

     簡單記:編譯運行都看左邊;

     其實對於靜態方法,是不需要對象的。直接用類名調用即可。


3、什么是接口,它的特點是什么?

     接口是功能的集合,同樣可以看做是一種數據類型,是比抽象類更為抽象的“類”;

     接口只描述應該具備的方法,並沒有具體實現,具體的實現由接口的實現類來完成。這樣就實現了功能 的定義與實現分離,優化了程序設計。

    一切事物均有功能,即一切事物皆有接口。

4、接口的成員特點有哪些?

     1. 接口中可以定義變量,但是變量必須有固定的修飾符修飾 public static final,

   固定格式:public static final 數據類型 變量名 = 值;

        所以接口中的變量也稱為常量,其值不能被改變。

        注意:修飾符 public static final 在接口變量定義中可以省略不寫;

        但是,不寫不等於沒有;

        三個修飾符也可以選擇性書寫。

     2. 接口中可以定義方法,方法也有固定的修飾符,public abstract

         固定格式:public abstract 返回值類型 方法名();

         修飾符 public abstract,可以不寫,也可以選擇性書寫

         但是,寫與不寫,都有

     3. 實現類實現接口,重寫接口中全部的抽象方法,創建實現類對象

         實現類重寫了一部分抽象方法,實現類還是一個抽象類

   4. 接口不可以創建對象 


5、抽象類和接口的區別是什么?

     相同點:

     都位於繼承的頂端,用於被其他類實現或繼承;

     都不能實例化對象;

     都包含抽象放大,其子類都必須重寫這些抽象方法。

     區別:

     抽象類為部分方法提供實現,避免子類重復實現這些方法,提高代碼的重用性;接口只包含抽象方法;

   一個類只能繼承一個直接父類(可能是父類),可以實現多個接口;接口彌補了Java的單繼承;

     抽象類是這個事物中應該具備的內容,繼承體系是is...a關系;

     接口是這個事物額外的功能,繼承體系是一種 like...a關系。

     二者選用:

     優先選用接口,盡量少用抽象類;

   需要定義子類的行為,又要為子類提供共性功能時才選用抽象類。


6、定義一個父類Animal eat方法 , 定義兩個子類 Dog 特有方法keepHome , Cat 特有方法 catchMouse ;並且 重寫eat方法
測試類中寫一個方法,參數列表有一個參數Animla類型,
要求: 調用該方法分別傳遞Dog對象 和Cat 對象, 使用instanceof進行將轉后調用eat,和他們的特有方法

/** * Animal類 * @author vanguard * */
public abstract class Animal { public abstract void eat(); }
1 public class Dog extends Animal { 2     public void eat() { 3         System.out.println("狗吃狗糧"); 4  } 5     public void keepHome() { 6         System.out.println("狗看家"); 7  } 8 }
public class Cat extends Animal { public void eat() { System.out.println("貓吃貓糧"); } public void catchMouse() { System.out.println("貓抓老鼠"); } }
 1 /**
 2  * 測試類中寫一個方法,參數列表有一個參數Animla類型  3  * @author vanguard  4  *  5  */
 6 public class Test {  7     public static void pet(Animal a) {  8         if(a instanceof Dog) {  9             Dog d = (Dog)a; 10  d.eat(); 11  d.keepHome(); 12  } 13         if(a instanceof Cat) { 14             Cat c = (Cat)a; 15  c.eat(); 16  c.catchMouse(); 17  } 18  } 19     public static void main(String[] args) { 20         pet(new Dog()); 21         pet(new Cat()); 22  } 23 }

 


7.測試: 如果一個方法的返回值類型是父類,那么能否返回一個子類對象.(該父類不管是類,抽象類還是接口)

 

public class Fu { public void show() { System.out.println("父類show方法"); } }
public class Zi extends Fu { public void show() { System.out.println("子類show方法"); } }
public class Test { public static Fu test(Zi z) { return z; } public static void main(String[] args) { Zi z = (Zi) test(new Zi()); } }

經過測試,如果一個方法的返回值類型是父類,那么能返回一個子類對象

 
8.現有兩種 OldPhone NewPhone; 兩個類都有call() sendMessage() 方法(考慮向上抽取一個父類);
已知接口IPlay中有一個方法 playGame(),NewPhone添加玩游戲的功能;
要求: 分別測試OldPhone和NewPhone的兩個方法,再測試新手機palyGame()的方法.

/** * Phone的抽象類 * 功能: * call * sendMessage * @author vanguard * */
public abstract class Phone { public abstract void call(); public abstract void sendMessage(); }
/** * 接口IPlay * 方法:playGame() * @author vanguard * */
public interface IPlay { public abstract void playGame(); }
/** * OldPhone類繼承Phone重寫call()、sendMessage() * @author vanguard * */
public class OldPhone extends Phone { public void call() { System.out.println("舊手機打電話"); } public void sendMessage() { System.out.println("舊手機發信息"); } }
/** * NewPhone類繼承Phone重寫call()、sendMessage(), * 實現IPlay接口,重寫PlayGame() * @author vanguard * */
public class NewPhone extends Phone implements IPlay { public void call() { System.out.println("新手機打電話"); } public void sendMessage() { System.out.println("新手機發信息"); } public void playGame() { System.out.println("新手機玩游戲"); } }
/** * 測試類 * 分別測試OldPhone和NewPhone的兩個方法,再測試新手機palyGame()的方法. * @author vanguard * */
public class Test { public static void main(String[] args) { OldPhone op = new OldPhone(); op.call(); op.sendMessage(); NewPhone np = new NewPhone(); np.call(); np.sendMessage(); np.playGame(); } }

 


9 .(完成下面的汽車案例)
描述:汽車都具有跑的功能,普通的奧迪車也不例外,但是高端的奧迪車除了具有跑的功能外,還具有自動泊車和無人駕駛的功能!
需求:定義普通奧迪車,高端奧迪車,實現描述中的功能並測試

 

/** * 定義汽車的抽象類 * @author vanguard * */
public abstract class Car { public abstract void run(); }

 

/** * 其他功能的接口 * 自動泊車 * 自動駕駛 * @author vanguard * */
public interface OtherFunction { public abstract void parkAssist(); public abstract void autopilot(); }
/** * 普通奧迪類 * @author vanguard * */
public class AudiCar extends Car { public void run() { System.out.println("普通奧迪車跑"); } }
/** * 高端奧迪類 * @author vanguard * */
public class HAudiCar extends Car implements OtherFunction { public void run() { System.out.println("高端奧迪車跑"); } public void parkAssist() { System.out.println("自動泊車"); } public void autopilot() { System.out.println("自動駕駛"); } }
/** * 測試類 * @author vanguard * */
public class Test { public static void main(String[] args) { AudiCar ac = new AudiCar(); ac.run(); HAudiCar hc = new HAudiCar(); hc.run(); hc.parkAssist(); hc.autopilot(); } }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM