java多型特性
多型:用父類的引用指向子類的物件
package com.qianfeng.test;
/*
-
多型:一種事物的多種形態 狗 == 動物 == 生物 學生 == 高階動物 == 動物 == 生物
-
多型的前提:類與類之間一定要有繼承的關係
*/
public class Demo6 {public static void main(String[] args) {
// 使用繼承--使用子類的引用工作 Dog dog = new Dog(); dog.play();// 呼叫父類的方法 dog.show();// 呼叫自己的方法 // 多型:用父類的引用指向子類的物件 // 注意:這裡說的父類不是單指直接的父類,只要是父類即可 Animal animal = new Dog(); /* * 一個程式執行的時候分成三個階段: 預編譯:程式開啟的時候,活兒已經幹完了. (預處理命令 #define) * 編譯:從開啟程式開始到點選左上角的三角之前的階段.----只會識別=前面的引用型別,不會去識別=後面的物件. * 執行:從點選三角開始.----這裡才會去真正識別=後面的物件. */ animal.play(); // animal.show();//呼叫方法的工作機制:1.首先由animal找到Dog物件,Dog物件再去呼叫show方法 // 不能通過的原因:在編譯的時候識別的是引用型別,不識別物件.所以只能識別出animal特有的方法,不能呼叫子類特有的方法. /* * 優點:可以提高程式碼的擴充套件性,使用之前定義好的功能,後面直接拿來使用,而不用再去建立新的方法.解釋在Demo7 * 缺點:不能直接呼叫子類特有的方法,只能呼叫父類有的方法 */
}
}
class Animal {
String name;
public Animal(String name) {
super();
this.name = name;
}
public Animal() {
super();
// TODO Auto-generated constructor stub
}
public void play() {
System.out.println("Animal-play");
}
}
class Dog extends Animal {
public void show() {
System.out.println("Dog-show");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("Cat-eat");
}
}
多型的優點:可以提高程式碼的擴充套件性,使用之前定義好的功能,後面直接拿來使用,而不用再去建立新的方法。
package com.qianfeng.test;
/*
-
優點:可以提高程式碼的擴充套件性,使用之前定義好的功能,後面直接拿來使用,而不用再去建立新的方法.解釋在Demo7
*/
public class Demo7 {public static void main(String[] args) {
Dog1 dog1 = new Dog1(); Cat1 cat1 = new Cat1(); Animal1 animal1 = new Animal1(); // feedDog(dog1); // feedCat(cat1); feedAnimal(dog1); feedAnimal(cat1); feedAnimal(animal1);
}
public static void feedAnimal(Animal1 animal) {// animal = dog1 = new Dog1()
//多型animal.eat();
}
// public static void feedDog(Dog1 dog1) {
// dog1.eat();
// }
//
// public static void feedCat(Cat1 cat1) {
// cat1.eat();
// }
}
class Animal1 {
String name;
public Animal1(String name) {
super();
this.name = name;
}
public Animal1() {
super();
// TODO Auto-generated constructor stub
}
public void play() {
System.out.println("Animal1-play");
}
public void eat() {
System.out.println("動物吃");
}
}
class Dog1 extends Animal1 {
public void show() {
System.out.println("Dog1-show");
}
public void eat() {
System.out.println("狗吃");
}
}
class Cat1 extends Animal1 {
public void eat() {
System.out.println("Cat1-eat");
}
}
向上轉型與向下轉型
package com.qianfeng.test;
/*
- 前提:這裡一定是多型
- 父類的型別比子類的型別等級高
- 向上轉型:相當於自動型別轉換,由低型別到高型別
-
注意:是將子類的引用轉成父類的引用,但是隻是將=前面進行轉換,與=後面無關
- 向下轉型:相當於強制型別轉換,由高型別到低型別
-
注意:是將父類的引用強制轉換成子類的引用.
*/
public class Demo8 {
public static void main(String[] args) {
// 向上轉型
Animal2 animal2 = new Dog2();// 多型
// 向下轉型--為了呼叫子類特有的方法
Dog2 dog2 = (Dog2) animal2;
dog2.show();// 呼叫子類特有方法
// 注意點:
// 1.這裡不叫向上轉型,這是錯誤.不能使用子類的引用指向父類的物件.
// Dog2 dog22 = new Animal2();
// 2.這裡不是多型,所以不是向下轉型,向下轉型的前提是多型
Animal2 animal22 = new Animal2();
Dog2 dog22 = (Dog2) animal22;
}
}
class Animal2 {
String name;
public Animal2(String name) {
super();
this.name = name;
}
public Animal2() {
super();
// TODO Auto-generated constructor stub
}
public void play() {
System.out.println("Animal2-play");
}
}
class Dog2 extends Animal2 {
public void show() {
System.out.println("Dog2-show");
}
}
class Cat2 extends Animal2 {
public void eat() {
System.out.println("Cat2-eat");
}
}
intstanceof關鍵字
package com.qianfeng.test;
public class Demo9 {
public static void main(String[] args) {
Dog3 dog3 = new Dog3();
Cat3 cat3 = new Cat3();
feedAnimal(cat3);
}
public static void feedAnimal(Animal3 animal3) {// animal3 = dog3 = new
// Dog3() 多型
// animal3.eat();
// 容錯處理:包容這塊出錯的程式碼,不讓他影響後面正常程式碼的執行-----增加使用者體驗
// intstanceof本身是一個運算子.構成: 物件 instanceof 類 ,作用:確定前面的物件是否是後面的類或子類的物件
// 返回值有兩個:如果是返回true
// 不是:返回false
// 注意點:
// 1.instanceof前後必須有繼承關係
if (!(animal3 instanceof Dog3)) {
System.out.println("傳入的物件不是Dog3或子類的物件");
System.exit(0);// 退出程式
}
// 向下轉型
Dog3 dog3 = (Dog3) animal3;
dog3.show();// 呼叫子類特有的方法
System.out.println("繼續");
}
}
class Animal3 {
String name;
public Animal3(String name) {
super();
this.name = name;
}
public Animal3() {
super();
// TODO Auto-generated constructor stub
}
public void play() {
System.out.println("Animal3-play");
}
public void eat() {
System.out.println("animal-eat");
}
}
class Dog3 extends Animal3 {
public void show() {
System.out.println("Dog3-show");
}
public void eat() {
System.out.println("Dog3-eat");
}
}
class Cat3 extends Animal3 {
public void eat() {
System.out.println("Cat3-eat");
}
}
成員在多型下的使用
package com.qianfeng.test;
/*
*成員在多型下的使用
*/
public class Demo10 {
public static void main(String[] args) {
// 繼承中成員的使用
Zi zi = new Zi();
System.out.println(zi.age);// 3 ,說明在繼承下,子類的優先
/*
* 多型下 當父類與子類定義了同名的屬性:成員變數編譯的時候看父類,執行的時候還是看父類 成員方法:編譯的時候看父類,執行的時候看子類
* 靜態的成員方法:編譯執行都看父類
*/
Fu fu = new Zi();
System.out.println(fu.age);// 5
fu.eat();
Fu.play();
}
}
class Fu {
int age = 5;
public void eat() {
System.out.println("eat");
}
public static void play() {
System.out.println("Fu-play");
}
}
class Zi extends Fu {
int age = 3;
public void show() {
System.out.println("Zi-show");
}
public static void play() {
System.out.println("Zi-play");
}
}
相關文章
- Java的三大特性:封裝、繼承、多型Java封裝繼承多型
- 封裝,特性,多型封裝多型
- Java多型Java多型
- Java高階特性—泛型Java泛型
- 什麼是Java多型?如何實現Java多型?Java多型
- 【Java】Java新特性--Records記錄型別Java型別
- java 介面,介面的特性,介面實現多型,面向介面程式設計Java多型程式設計
- Java 的多型Java多型
- java多型demoJava多型
- java核心思想物件導向三大特性(封裝,繼承,多型)Java物件封裝繼承多型
- Java 10新特性:型別推斷Java型別
- java中的多型Java多型
- Java學習-多型Java多型
- java基礎(三)—–java的三大特性之多型Java多型
- java 多型知識點Java多型
- Java物件導向--多型Java物件多型
- java繼承與多型Java繼承多型
- Java:多型乃幸福本源Java多型
- java多型性淺析Java多型
- Java物件導向04——三大特性之多型Java物件多型
- java 多型知識點2Java多型
- 何為Java 中的多型?Java多型
- Java-對多型的理解Java多型
- JAVA中“多型”案例學習Java多型
- 物件導向三大特性-----封裝、繼承、多型物件封裝繼承多型
- 超詳細Java基礎-多型Java多型
- Java007-物件導向(多型)Java物件多型
- JAVA高階物件導向二:認識多型 多型的好處Java物件多型
- Java中的類繼承與多型Java繼承多型
- Java多型實現的必要條件Java多型
- Java JDK1.5: 泛型 新特性的講解說明JavaJDK泛型
- 利用 Laravel Macroable 特性優化多型引數傳遞的技巧分享LaravelMac優化多型
- JAVA的特性Java
- Rust 泛型與特性Rust泛型
- Java--物件導向三大特徵多型Java物件特徵多型
- Java基礎之淺談繼承、多型Java繼承多型
- java-物件導向程式設計--多型Java物件程式設計多型
- Java高階特性泛型看這一篇就夠了Java泛型