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(); } }