多型和抽象類
多型
1.要實現多型,那麼必須存在父子關係(繼承關係或者實現介面)
2.實現多型的方式:將父類物件的宣告指向子類物件,例如Pet pet = new Dog();
例如:
/*
這是一個類名為Pet的父類
*/
public class Pet {
public void print() {
System.out.println("----呼叫Pet父類的print方法-----");
}
}
/*
這是類名為Dog的第一個子類
*/
public class Dog extends Pet{
public void print() {
System.out.println("-----呼叫Dog子類的print方法-----");
}
}
/*
這是類名為Cat的第二個子類
*/
public class Cat extends Pet{
public void print() {
System.out.println("-----呼叫Cat子類的print方法----");
}
}
/*
這是類名為Test的測試類
*/
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
dog.print();
//這裡的輸出結果為:(-----呼叫Dog子類的print方法-----)
Cat cat = new Cat();
cat.print();
//這裡輸出的結果為:(-----呼叫Cat子類的print方法----)
Pet pet = new Pet();
pet.print();
//這裡輸出的結果為:(-----呼叫Pet父類的print方法----)
//這裡使用多型方法,將父類物件的宣告指向子類物件
Pet pet1 = new Dog();
pet1.print();
//這裡輸出的結果為:(-----呼叫Dog子類的print方法-----)
}
}
3.向上轉型:向上轉型就是將子類物件賦值給父類物件的過程
4.實現多型以後,從表面上看呼叫的是父類的方法,實際呼叫的是子類覆蓋掉父類的方法
public class Test {
public static void main(String[] args) {
//這就是向上轉型
Pet pet1 = new Dog();
//實現多型以後,從表面上看呼叫的是父類的方法,實際呼叫的是子類覆蓋掉父類的方法
pet1.print();
//這裡輸出的結果為:(-----呼叫Dog子類的print方法-----)
}
}
5.向下轉型:向下轉型就是將多型的父類物件強制轉換成子類物件的過程
6.當需要呼叫子類獨有的方法和屬性的時候,必須向下轉型
public class Cat extends Pet{
public void print() {
System.out.println("-----呼叫Cat子類的print方法----");
}
//這是一個子類獨有的方法
public void printCat() {
System.out.println("----我是一隻貓----");
}
}
public class Test {
public static void main(String[] args) {
//這就是向上轉型
Pet pet2 = new Cat();
//這就是向下轉型
Cat cat2 = (Cat)pet2;
//當需要呼叫子類獨有的方法和屬性的時候,必須向下轉型
cat2.printCat();
//輸出的結果為:(----我是一隻貓----)
cat2.print();
//輸出的結果為:(-----呼叫Cat子類的print方法----)
}
}
注意:
7.透過instanceof判斷當前的pet2物件是否是Dog物件,如果是返回值為true,否則返回值為false
8.報錯資訊為:(Exception in thread “main” java.lang.ClassCastException: com.four.Pet cannot be cast to com.four.Cat at com.four.Test.main(Test.java:18))
這是當時遇到的一個報錯,需要特別注意。解決方法如下:
錯誤程式碼為:
public class Test {
public static void main(String[] args) {
Pet pet2 = new Cat();
Dog dog2 = (Dog)pet2;
dog2.print();
}
}
修改後的正確程式碼為:
public class Test {
public static void main(String[] args) {
Pet pet2 = new Cat();
//透過instanceof判斷當前的pet2物件是否是Dog物件,如果是返回值為true,否則返回值為false
if(pet2 instanceof Dog) {
Dog dog2 = (Dog)pet2;
dog2.print();
}else if(pet2 instanceof Cat) {
Cat cat2 = (Cat)pet2;
cat2.print();
}
}
}
抽象類
1.抽象類的語法格式:修飾符 abstract class 類名{類體}
2.定義抽象方法的格式:修飾符 abstract 返回值型別 方法名(引數列表)
3.抽象類中可以定義普通方法,也可以定義抽象方法,普通類中不能定義抽象方法
4.抽象類中可以定義構造方法,普通類也可以,當一個普通類繼承了抽象類之後,該普通類必須實現抽象類中的抽象方法 鄭州做婦科檢查價格
/*
這是一個類名為Animal的抽象類
*/
public abstract class Animal {
//這是定義的一個變數
public String name;
//這是一個名為print的普通方法
public void print() {
System.out.println("-----我的print方法-----");
}
//這是一個名為method的抽象方法
public abstract void method();
//這是一個無參的建構函式
public Animal() {
}
//這是一個有參的建構函式
public Animal(String name) {
this.name = name;
}
}
5.抽象類不能直接建立物件,如果要建立物件,則必須是多型的方式建立。
例如
錯誤案例,這樣寫會直接報錯。
/*
這是一個類名為Test的測試類
*/
public class Test {
public static void main(String[] args) {
Animal animal = new Animal();
}
}
真確案例:
/*
建立一個類名為Bird
*/
public class Bird extends Animal{
public void method() {
System.out.println("-----我是一隻小鳥,我會飛------");
}
}
public class Test {
public static void main(String[] args) {
//利用多型的方式建立抽象類的物件
Animal animal = new Bird();
animal.method();
}
}
6.抽象類中的方法不能用private、final修飾,因為抽象類中的方法是用來被繼承的。
總結
抽象類的目的就是:抽象類的作用類似於“模板”,其目的是方便開發人員根據抽象類的格式來修改和建立新類。抽象類主要用於繼承,有利於程式的擴充套件。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2670045/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 繼承+多型+抽象類繼承多型抽象
- java多型抽象類例項Java多型抽象
- 菜鳥成長系列-多型、介面和抽象類多型抽象
- Java抽象類、繼承及多型和介面卡的實現Java抽象繼承多型
- 抽象方法和抽象類抽象
- 抽象類和抽象方法抽象
- Java基礎之介面與抽象類及多型、內部類Java抽象多型
- java抽象類和抽象方法Java抽象
- 第10章 物件和類——物件和類(六) 抽象資料型別物件抽象資料型別
- 介面和抽象類抽象
- 抽象類和介面抽象
- 多維度分析:抽象類和介面的區別抽象
- Java第八課. 物件導向特徵3-多型&抽象類Java物件特徵多型抽象
- 重寫,隱藏,抽象,多型抽象多型
- 介面和抽象類 (abstract)抽象
- 介面的行為抽象和抽象類的行為抽象抽象
- 多型體驗,和探索爺爺類指標的多型性多型指標
- java中抽象類和介面Java抽象
- 介面和抽象類詳解抽象
- 抽象類、抽象欄位、抽象方法抽象
- Java之繼承和抽象類Java繼承抽象
- Java基礎-抽象類和介面Java抽象
- 抽象類和匿名方法的使用抽象
- 抽象類和介面的區別抽象
- 繼承 重寫和抽象類繼承抽象
- 介面和抽象類的區別抽象
- Java抽象類和介面 小白版Java抽象
- 抽象類抽象
- PHP 抽象類繼承抽象類時的注意點PHP 抽象類繼承抽象類時的注意點PHP抽象繼承
- scala_繼承、型別判斷、抽象類、匿名內部類繼承型別抽象
- 抽象類和介面,你瞭解多少?抽象
- Java抽象(方法,類)和Java的介面Java抽象
- 抽象類和介面的相同點和不同點抽象
- 淺析 Python 的類、繼承和多型Python繼承多型
- Java 抽象類Java抽象
- 14、抽象類抽象
- PHP 抽象類繼承抽象類時的注意點PHP抽象繼承
- 物件導向基礎(2)--抽象類 介面 集合 泛型物件抽象泛型