Java多態(tài)向上轉(zhuǎn)型和向下轉(zhuǎn)型及優(yōu)點總結

多態(tài)
- 什么是多態(tài)?為什么要使用多態(tài)?
簡單來說是多種形態(tài),具體來說是去完成某個事情,當不同對象去完成同一件事表現(xiàn)出來的不同結果/狀態(tài)
打個比方就是同一個人對待不同人表現(xiàn)出來的形態(tài)是不同的

2. 多態(tài)實現(xiàn)的三個條件:

向上轉(zhuǎn)型和向下轉(zhuǎn)型

向上轉(zhuǎn)型和重寫
- 將子類對象給父類類型的引用
父類類型 對象名 = new 子類類型()
直接賦值的
class Animal{
public String name;
public int age;
public Animal(String name,int age){
this.name = name;
this.age = age;
}
// 父類中的this是當前對象的引用
public void eat(){
System.out.println(this.name + " ");
}
}
class Dog extends Animal{
public Dog(String name,int age){
super(name,age);// 調(diào)用父類的構造方法進行從父類繼承過來的成員的構造
}
public void back(){
System.out.println(this.name + "汪汪汪 ");
}
}
public class test {
public static void main(String[] args) {
// 向上轉(zhuǎn)型
Animal animal = new Dog("小白",3);
animal.eat();// 調(diào)用父類自己的eat
}
}
- 第二種向上轉(zhuǎn)型,傳參的

- 傳返回值的向上轉(zhuǎn)型

- 重寫的三個條件:
父類實現(xiàn)的方法不滿足你需要的功能的時候可以進行重寫
a. 方法的返回值一樣
方法名一樣
方法的參數(shù)列表一樣
b. 被重寫的方法的訪問修飾限定符在子類中的要大于等于父類的
權限大小:private < 默認的 < protected < public
c. 被private的方法是不能被重寫的
d. 被static修飾的方法是不能被重寫的
e. 被final修飾的方法是不可以被重寫的,因為具有了常性
f. 構造方法也是不可以被重寫的
public final void eat(){
// ...
}
被重寫的方法返回值類型可以不同,但必須是父子關系

重寫:在子類和父類中有同名的方法,
這時候子類對象給父類類型的引用(向上轉(zhuǎn)型),使用該對象再調(diào)用,調(diào)用的是子類的方法,不再是父類的方法上面的過程叫做動態(tài)綁定下面是子類重寫了父類的eat

@override可以提示你重寫是否寫錯了,提示語法錯誤

重寫和重載的區(qū)別

- object類是所有類的父類
Dog類重寫了自己的toString,就使用自己的toString
沒有重寫就調(diào)用父類的toString

動態(tài)綁定和靜態(tài)綁定
- 靜態(tài)綁定:在編譯的時候就確定了調(diào)用哪個方法,比如重載
- 動態(tài)綁定:在編譯的時候不能確定,在運行時確定調(diào)用哪個方法,比如重寫


用代碼來解釋什么是多態(tài)

- 不能調(diào)用子類特有的方法,只能調(diào)用父類的方法,重寫啦才調(diào)用子類的方法(而且是同一個名字的方法,比如eat())

向下轉(zhuǎn)型
- 父類對象給子類類型的引用
- 向下轉(zhuǎn)型不安全

- 如果animal引用的對象是Cat對象的實例,如果是就成功,不是就走下面的打印

多態(tài)的優(yōu)點
- 能夠降低代碼的圈復雜度,避免使用大量的if-else
- 一段代碼中條件語句和循環(huán)語句出現(xiàn)的個數(shù) , 這個個數(shù)就稱為 " 圈復雜度 ".
不使用多態(tài),打印下列圖形?
class Shape {
public void draw() {
System.out.println("畫圖");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("?");
}
}
class Cycle extends Shape {
@Override
public void draw() {
System.out.println("?");
}
}
class Flower extends Shape {
@Override
public void draw() {
System.out.println("?");
}
}
class Test2 {
public static void drawShapes() {
Rect rect = new Rect();
Cycle cycle = new Cycle();
Flower flower = new Flower();
String[] shapes = {"cycle","rect","cycle","rect","flower"};
for(String shape : shapes) {
if(shape.equals("cycle")) {
cycle.draw();
}else if (shape.equals("rect")) {
rect.draw();
}else{
flower.draw();
}
}
}
public static void main(String[] args) {
drawShapes();
}
}
使用多態(tài)
public static void main(String[] args){
Shape shapes = {new Cycle(),new Rect(),new Cycle(),new Rext(),new Flower()};
// 向上轉(zhuǎn)型
for(Shape shape : shapes){
shape.draw();
}
}
- 可擴展能力強
如果要新增一種新的形狀,使用多態(tài)該代碼成本也比較低
class Flower extends Shape{
public void draw(){
System.out.println("花!");
}
}
屬性沒有多態(tài)
當父類的成員變量和子類的成員變量同名時,通過父類引用,只能訪問父類的變量構造方法是沒有多態(tài)的,因為不能重寫,重寫會造成構造的混亂


總結
多態(tài)主要就是下圖中的三點

向上轉(zhuǎn)型有什么用?
是重寫的前提,一個子類對象給父類類型的引用動態(tài)綁定有什么用?
是實現(xiàn)多態(tài)的基礎,在編譯的時候不確定調(diào)用哪個方法,在運行的時候確定調(diào)用哪個方法
動態(tài)綁定在編譯時顯示地是調(diào)用父類的方法,但是在運行時顯示的是調(diào)用子類重寫父類的方法
到此這篇關于Java多態(tài)向上轉(zhuǎn)型和向下轉(zhuǎn)型及優(yōu)點的文章就介紹到這了,更多相關Java多態(tài)詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python爬蟲之爬取2020女團選秀數(shù)據(jù)
本文將對比《青春有你2》和《創(chuàng)造營2020》全體小姐姐,鑒于兩個節(jié)目的數(shù)據(jù)采集和處理過程基本相似,在使用Python做數(shù)據(jù)爬蟲采集的章節(jié)中將只以《創(chuàng)造營2020》為例做詳細介紹。感興趣的同學可以照貓畫虎去實操一下《青春有你2》的數(shù)據(jù)爬蟲采集,需要的朋友可以參考下2021-04-04
使用springboot不自動初始化數(shù)據(jù)庫連接池
這篇文章主要介紹了使用springboot不自動初始化數(shù)據(jù)庫連接池,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

