java多態(tài)的理解
如果放在生活中多態(tài)就是比如做一件事情,不同人有不同的實(shí)現(xiàn)方式。
但是在java這里指的多態(tài),它設(shè)定了限制,必須是多個(gè)子類繼承同一個(gè)父類實(shí)現(xiàn)方法的重寫。
同時(shí)創(chuàng)建的對(duì)象的時(shí)候new出來的子類同時(shí)指定父類引用。(這樣就造成了生成的對(duì)象只能調(diào)用和父類共有的方法,不能調(diào)用子類特有的方法)。
多態(tài)是同一個(gè)行為具有多個(gè)不同表現(xiàn)形式或形態(tài)的能力。
Animal am = new Cat();語句在堆內(nèi)存中開辟了子類(Cat)的對(duì)象,并把棧內(nèi)存中的父類(Animal)的引用指向了這個(gè)Cat對(duì)象。
執(zhí)行強(qiáng)轉(zhuǎn)語句Cat ct = (Cat)am;之后,ct(棧里面聲明的Cat類型的變量)就指向最開始在堆內(nèi)存中創(chuàng)建的那個(gè)Cat類型的對(duì)象了。
多態(tài)存在的三個(gè)必要條件
繼承
重寫
父類引用指向子類對(duì)象
Parent p = new Child();
成員變量 編譯看左邊(父類),運(yùn)行看左邊(父類) 成員方法 編譯看左邊(父類),運(yùn)行看右邊(子類)。動(dòng)態(tài)綁定 靜態(tài)方法 編譯看左邊(父類),運(yùn)行看左邊(父類)。
(靜態(tài)和類相關(guān),算不上重寫,所以,訪問還是左邊的) 只有非靜態(tài)的成員方法,編譯看左邊,運(yùn)行看右邊
多態(tài)的弊端:多態(tài)后不能使用子類特有的屬性和方法。
如果我們非要想用也是可以的
那我們就可以把這個(gè)父類引用指向了子類對(duì)象的家伙am再?gòu)?qiáng)制變回Cat類型。
package com.lky.h1;
class Animal {
? ?int num = 10;
? ?static int age = 20;
? ?public void eat() {
? ? ? ?System.out.println("動(dòng)物吃飯");
? ?}
? ?public static void sleep() {
? ? ? ?System.out.println("動(dòng)物在睡覺");
? ?}
? ?public void run(){
? ? ? ?System.out.println("動(dòng)物在奔跑");
? ?}
}
class Cat extends Animal {
? ?int num = 80;
? ?static int age = 90;
? ?String name = "tomCat";
? ?public void eat() {
? ? ? ?System.out.println("貓吃飯");
? ?}
? ?public static void sleep() {
? ? ? ?System.out.println("貓?jiān)谒X");
? ?}
? ?public void catchMouse() {
? ? ? ?System.out.println("貓?jiān)谧ダ鲜?#34;);
? ?}
}
public class Test3 {
? ?public static void main(String[] args) {
? ? ? ?Animal am = new Cat();
? ? ? ?am.eat();
? ? ? ?am.sleep();
? ? ? ?am.run();
? ? ? ?//am.catchMouse();這里先注釋掉,等會(huì)會(huì)說明
? ? ? ?//System.out.println(am.name);//這里先注釋,待會(huì)說明
? ? ? ?System.out.println(am.num);
? ? ? ?System.out.println(am.age);
? ?}
}
對(duì)于向上轉(zhuǎn)型,程序會(huì)自動(dòng)完成,而對(duì)于向下轉(zhuǎn)型時(shí),必須明確的指明要轉(zhuǎn)型的子類類型。
向上轉(zhuǎn)型,new 了一個(gè)子類可以指向父類
向下轉(zhuǎn)型,把指向父類的轉(zhuǎn)成子類
我這里的向下轉(zhuǎn)型指的是把向上轉(zhuǎn)型返回的對(duì)象指向強(qiáng)轉(zhuǎn)成子類,我可以沒有說new了一個(gè)父類指向子類,現(xiàn)實(shí)中不行,java也是不行的。