多態
1.引用多態:1)父類的引用可以指向本類的對象;2)父類的引用可以指向子類的對象
public static void main(String[] args) { Animal obj1 = new Animal(); //父類的對象指向本類 Animal obj2 = new Dog(); //父類的引用可以指向子類的對象 //Dog obj3 = new Animal(); 不可以使用子類的引用指向父類 }
2.方法多態 1)創建本類對象時,調用的方法爲本類方法;2)創建子類對象時,調用的方法爲子類重寫的方法或者繼承的方法
public class Initial { public static void main(String[] args) { // TODO Auto-generated method stub Animal obj1 = new Animal(); //父類的對象指向本類 Animal obj2 = new Dog(); //父類的引用可以指向子類的對象 //Dog obj3 = new Animal(); 不可以使用子類的引用指向父類 obj1.eat(); obj2.eat(); } }
注意:如果是子類中獨有的方法,則不能通過“父類的引用指向子類的對象”
3.引用類型轉換
1)向上類型轉換(隱式/自動類型轉換)——小類型到大類型
2)向下類型轉換(強制類型轉換)——大到小
3)instanceof運算符,解決引用對象類型,避免類型轉換的安全問題——判斷某個類型是否是某個類型的子類型,返回一個bool值
Dog dog = new dog(); Animal animal = dog; //自動類型提升 向上轉換 Dog dog2 = (Dog)animal; //向下類型轉換 Cat cat = (Cat)animal;//強制類型轉換Cat,編譯器不會報錯;但是animal對象在內存中是dog類型,強制轉換成cat類型會造成類型不匹配——cat已經不是animal的子類型了 //使用instanceof Dog dog = new Dog(); Animal animal = dog; if(animal instanceof Dog){ Dog dog2 = (Dog)animal; }else{ System.out.println("無法dog"); } if(animal instanceof Cat){ Cat cat = (Cat)animal; }else{ System.out.println("無法進行類型轉換---"); }
4.Java中的抽象
1)語法定義:使用abstract修飾
2)場景:a)父類只是知道子類包含的方法,無法確切子類的方法如何實現——子類必須有那些方法;b)從多個具有相同特徵類中抽象一個抽象類,以抽象類作爲子類模版
3)作用:限制規定子類必須實現的某些方法,但不關注實現細節
4)使用規則:a.abstractd 定義抽象方法,只有聲明,不需要實現;b.包含抽象方法的類是抽象類;c.抽象類中可以包含普通方法,也可以沒有抽象方法;d.抽象類不能直接創建,可以定義引用變量
抽象類: package com.imooc; public abstract class Telephone { public abstract void call(); public abstract void message(); } 子類1: package com.imooc; public class SmartPhone extends Telephone { public void call() { // TODO Auto-generated method stub System.out.println("通過語音電話"); } public void message() { // TODO Auto-generated method stub System.out.println("通過語音短信"); } } 子類2: package com.imooc; public class CellPhone extends Telephone { public void call() { // TODO Auto-generated method stub System.out.println("通過鍵盤電話"); } public void message() { // TODO Auto-generated method stub System.out.println("通過鍵盤短信"); } } 接口函數: package com.imooc; public class Initial { public static void main(String[] args) { // TODO Auto-generated method stub Telephone tel = new CellPhone(); tel.call(); tel.message(); Telephone tel2 = new SmartPhone(); tel2.message(); tel2.call(); } }
5.Java中的接口
1)接口:接口定義了某一些類所遵循的規範,接口不關心類的內部數據,不關心類的方法實現細節,只規定類裏必須提供的方法。
2)使用interface關鍵字,而類用class。接口中都是常量或抽象方法
3)接口用來被繼承和被實現的,使用public,不能使用private和protect,interface前面使用abstract,abstract、public static final可以省略
public abstract interface IPlayGame {
public static final int a = 8;
public abstract void playGame(); // 不能 ...playGame(){};
}
注意:接口中方法不能有方法體 例如:錯-void gg(){} 對-void gg();
定義接口: public abstract interface IPlayGame { public static final int a = 6; public abstract void playGame(); } 繼承接口: public class psp implements IPlayGame { public void playGame() { // TODO Auto-generated method stub System.out.println("具有玩遊戲的功能"); } }