這篇文章為大家帶來了關於java的相關知識,主要講的是Java之理解多態詳解,繼承關係使一個子類能繼承父類的特徵,並且附加一些新特徵。子類別是它的父類別的特殊化,每個子類別的實例都是其父類別的實例,但是反過來不成立,希望對大家有幫助。
推薦學習:《java影片教學》
繼承關係使一個子類別能繼承父類別的特徵,並且附加一些新特徵。子類別是它的父類別的特殊化,每個子類別的實例都是其父類別的實例,但是反過來不成立。例如:每個圓都是一個幾何對象,但並非每個幾何對像都是圓。因此,總是可以將子類別的實例傳給需要父類型的參數。參考案例如下:
public class PolymorphismDemo{ /** Main method */ public static void main(String[] args){ displayObject(new Circle(1,"red",false)); displayObject(new Rectangle(1,1,"black",true)); } public static void displayObject(GeometriicObject object){ System.out.println("Created on "+ object.getDateCreated()+".Color is"+object.getColor()); } }
Created on Mon Mar 09 19:25:20 EDT 2011.Color is red
Created on Mon Mar 09 19:25:20 EDT 2011.Created on Mon Mar 09 19:25:20 EDT 2011.Created is black
方法displayObject具有GeometriicObject型別的參數。可以透過傳遞任何GeometriicObject的實例來呼叫displayObject。使用父類別物件的地方都可以使用子類別的物件。這就是通常說的多態。 簡單來說,多態意味著父類型的變數可以引用子類型的物件。
多態的前提:繼承(即必須有子父類別關係。)使用多態後的父類別引用變數呼叫方法時,會 呼叫子類別重寫後的方法。定義格式:父類別類型變數名稱=new 子類別(); 父類別引用指向子類別物件,如:Animal a = new Cat(); 多型中,編譯看左邊,執行看右邊
instanceof是Java的關鍵字。 Java關鍵字中的每個字母都是小寫的。
為了更能理解類型轉換,可以認為它們類似於動物、北極熊、熊貓之間的關係,其中動物類Animal是北極熊貓類Polar bear和熊貓類Panda類的父類。北極熊是動物,所以,總是可以將 Polar bear的實例安全地賦值給Animal變數。 此關鍵字用法是判斷某個物件是否屬於某種資料型別,傳回值為布林類型。
Fu Zz=new Xu(); Fu Zzz=new yiting(); if(f1 instanceof Xu){ System.out.println("Zz是Xu的类型"); } else{ System.out.println("Zzz是yiting的类型"); }
總是可以將子類別的實例轉換為父類別的變量,稱為向上轉換,因為子類別的實例總是它的父類別的實例。
作用:
減少一些重複的程式碼物件實例化的時候可以根據不同需求實例化不同的物件
package project2; class Animal{ int num=100; void say(){ System.out.println("It's an Animal."); } } class Cat extends Animal{ int num=50; void say(){ System.out.println("It's a Cat."); } void bark(){ System.out.println("喵喵喵!"); } } public class project2{ public static void main(String[] args) { Animal cat=new Cat();//向上转型 System.out.println(cat.num); cat.say(); // cat.bark(); } }
執行結果:
100
It's a Cat.
向轉型不要強制轉型,父類別引用指向的或呼叫的方法是子類別的方法,這個叫做動態綁定。向上轉型後父類別引用不能呼叫子類別自己的方法。
把一個父類別的實例轉換成它的子類別變數。必須使用轉換標記(子類別名稱)進行顯示轉換,並向編譯器表明你的意圖。為使轉換成功,必須確保要轉換的物件是子類別的一個實例。
作用:
向轉型時 ,會遺失子類別物件獨有的其他方法;可以透過向下轉型再重新轉回。
package project2; class Animal{ int num=100; void say(){ System.out.println("It's an Animal."); } } class Cat extends Animal{ int num=50; void say(){ System.out.println("It's a Cat."); } void bark(){ System.out.println("喵喵喵!"); } } public class project2{ public static void main(String[] args) { Animal cat=new Cat();//向上转型 Cat cat2=(Cat) cat;//向下转型 System.out.println(cat2.num); cat2.say(); cat2.bark(); } }
運行結果:
###############################################################################################################################################################################################################################幫助####提示:要重寫一個方法,需要在子類別中使用和父類別一樣的簽章來對方法進行定義。 ######子類別從父類別繼承方法。有時,子類別需要修改父類別中定義的方法的實現,稱為方法重寫。 ######以下幾點值得注意:######重寫的方法必須與被重寫的方法具有相同的簽名,以及相同或相容的回傳類型。相容的意思是重寫方法的回傳類型可以是被重寫方法的回傳類型的子類型。只有當實例方法可存取時,它才能被重寫。如果子類別中定義的方法在父類別中是私有的,那麼這兩個方法完全沒有關係。與實例方法一樣,靜態方法也能被繼承。但是,靜態方法不能被重寫。如果父類別定義的靜態方法在子類別中被重新定義,那麼在父類別中定義的靜態方法將會被隱藏。可以使用語法「父類別名稱.靜態方法名稱」呼叫隱藏的靜態方法。防止繼承和重寫###50
It's a Cat.
喵喵喵!
一个被final修饰的类和方法都不能被继承。被final修饰的数据域是一个常数。
有时候,可能希望防止类被继承。在这种情况下,使用final修饰符表明一个类是最终类,是不能作为父类的。Math类就是一个最终类。String、StringBuilder和StringBuffer类以及所有基本数据类型的包装类也都是最终类。例如,如下类A 就是最终类,不能被继承:
public final class A{ //Data fields,constructors, and methods omitted }
也可以定义一个方法为最终,最终方法不能被它的子类重写。例如如下,不能被重写:
public class Test { //Data fields,constructors, and methods omitted public final void m() { // Do something } }
注:修饰符public、protected、private、static、abstract以及final可以用在类和类的成员上,只有final修饰符还可以用在方法中的局部变量上。方法内的final局部变量就是常量。
为了重写一个方法,必须使用与它的父类中的方法一样的签名、一样或者兼容的返回类型来定义子类中的方法。实例方法只有在可访问时才能重写。这样,私有方法是不能重写的,因为它是不能在类本身之外访问的。如果子类中定义的方法在父类中是私有的,那么这两个方法是完全没有关系的噢!静态方法与实例方法一样可以继承。但是,静态方法不能重写,如果父类中定义的静态方法在子类中重新定义,那么父类中定义的方法被隐藏。可以使用表达式obj instanceof AClass 测试一个对象是否是一个类的实例。可以使用final修饰符来表明一个类是最终类,是不能被继承的;也可以表明一个方法是最终的,是不能被重写的。
推荐学习:《java视频教程》
以上是Java概念理解總結之多態性的詳細內容。更多資訊請關注PHP中文網其他相關文章!