public class Animal {
public static void main(String[] args){
//以前的方法創(chuàng)建貓對象
//這句理解為 創(chuàng)建一個貓對象织阅,貓就是一只貓拯田,不是其它的什么東西
Cat c = new Cat();
c.eat();
//多態(tài)的創(chuàng)建方法
// Animal1 a 是聲明了一個父類引用勒奇,這個引用指向了子類對象直秆。就是說貓是一個動物濒募。 這就是那句要有父類引用指向子類對象
//
Animal1 a = new Cat();
a.eat();//這個的輸出結(jié)果還是貓要吃魚
}
}
/*
* 多態(tài)概述:事物存在的多種形態(tài)
* 多態(tài)前提:
* 1.要有繼承關(guān)系
* 2.要有方法重寫
* 3.要有父類引用指向子類對象
*
* */
//定義一個動物類
class Animal1{
//定義一個吃方法
public void eat(){
System.out.println("動物吃法");
}
}
//定義一個貓類繼承自Animal
class Cat extends Animal1{
//重寫父類的吃的方法
public void eat(){
System.out.println("貓要吃魚");
}
}
Pragma mark — NO.2 多態(tài)成員變量
public class Polymorphic {
public static void main(String[] args){
Father f = new Son();//父類引用指向子類對象
System.out.println(f.num);
//這個打印結(jié)果是10; 編譯看左邊/運行看右邊
//解釋一下:
/*
* 當我們創(chuàng)建new Son() 子類對象的時候,子類對象可以訪問分類的成員變量圾结。
* 是通過super來訪問的瑰剃,對于子類創(chuàng)建好在堆區(qū)分配好內(nèi)存后,就會有兩塊區(qū)域筝野,一塊是
* 父類的成員變量顯示初始化為10晌姚,通過super訪問的
* 另一塊就是子類自己的成員變量初始化為20
* 對于f.num ,來說這個指針引用是指向father的,所以它只能看到子類中屬于自己的
* 那塊區(qū)域歇竟,所以打印為10
**/
//再來
Son s = new Son();
System.out.println(s.num);
}
}
//父類
class Father{
//成員變量
int num = 10;
}
//子類
class Son extends Father{
int num = 20;
}
Pragma mark — NO.3 成員方法
//成員方法:編譯看左邊/運行看右邊
Father f = new Son();
f.print();//打印出來是:我是子類挥唠。這個就是動態(tài)綁定
//編譯的時候,先去找父類有沒有這個print方法焕议,如果有宝磨,編譯通過,然后運行的時候去子類中找這個print方法
//父類
class Father{
//成員變量
int num = 10;
//成員方法
public void print(){
System.out.println("我是父類");
}
}
//子類
class Son extends Father{
int num = 20;
public void print(){
System.out.println("我是子類");
}
Pragma mark — NO.4 靜態(tài)方法
//靜態(tài)方法--編譯看左邊,運行看左邊
Father f = new Son();
f.method();//打印我是父類靜態(tài)方法
class Father{
//成員變量
int num = 10;
//成員方法
public void print(){
System.out.println("我是父類");
}
//靜態(tài)方法
public static void method(){
System.out.println("我是父類靜態(tài)方法");
}
}
//子類
class Son extends Father{
int num = 20;
public void print(){
System.out.println("我是子類");
}
//靜態(tài)方法
public static void method(){
System.out.println("我是子類靜態(tài)方法");
}
}
Pragma mark — NO.5 超人的例,理解向上和向下轉(zhuǎn)型
public class SuperMan {
public static void main(String[] args){
Person1 p = new Super();//父類引用指向子類對象唤锉,可以理解為超人平時偽裝為一個普通人
//父類引用指向子類對象就是向上轉(zhuǎn)型:就相當于將super這個子類提升到了父類的層次
//就是說初次見面世囊,超人只會說他是json,來談生意的窿祥,不會是他是超人株憾,但是實際和你談生意的是超人
System.out.println(p.name);
p.takeMethod();
//然后出現(xiàn)情況,超人要去救人晒衩,但是沒證明他是超人之前是不會讓他去救人的
//p.fly();//這樣調(diào)用超人的方法是會出錯的嗤瞎,因為當前超人是以普通人身份出現(xiàn)的,他就不具備救人的技能
//所以我們想要去救人听系,就得向人們證明你是超人猫胁,所以我們得做一個向下轉(zhuǎn)型
Super s = (Super)p; //這個就是向下轉(zhuǎn)型
System.out.println(s.name);
s.fly();
/*
* 基本數(shù)據(jù)類型自動類型提升和強制類型轉(zhuǎn)換
* */
int i = 10;
byte b = 20 ;
i = b;//這就是自動類型提升
System.out.println(String.valueOf(i));
//b = i;//直接將int型賦值給byte類型會報錯,是把大類型賦值給小類型跛锌,會有精度損失
b = (byte)i;//強制類型轉(zhuǎn)換
}
}
//我們通過這個例子描述一個超人的故事
class Person1 {
//平時的時候超人叫json,在談生意
String name = "我叫Json";
public void takeMethod(){
System.out.println("我來和你談生意");
}
}
//子類--超人
class Super extends Person1 {
String name = "我是SuperMan";
public void takeMethod(){
System.out.println("我是超人來和你談生意");
}
//超人特有的方法
public void fly(){
System.out.println("我要去救人了哦");
}
}
Pragma mark — NO.6 多態(tài)的好處
public class Main {
public static void main(String[] args) {
//創(chuàng)建貓對象
// Cat c1 = new Cat();
// c1.eat();
//我們想讓貓吃的動作執(zhí)行很多次,我們寫個方法
method(new Cat());
//method(new Dog());這樣寫是錯誤的弃秆,狗是一只貓是不行的塞
method(new Dog());
}
// public static void method(Cat c){
// c.eat();
// }
//
// public static void method1(Dog d){
//
// d.eat();
// }
//看了上面的,思考如果我們還有單獨的豬髓帽,牛菠赚,羊類,意味著這種method方法我們都要去寫一遍了郑藏。這肯定不好
//想想解決辦法
//我們直接傳入這個父類衡查,當我們傳入?yún)?shù)是子類的時候,就相當于父類引用指向子類對象了
public static void method(Animal a ){
// a.eat();
// //這樣寫有好的地方必盖,弊端我們看看
// // a.catchMouse();//這個方法是狗類自己的拌牲,編譯時在父類中找不到,所以不行
// //要使用子類獨有的方法歌粥,我們可以進行向下轉(zhuǎn)型
// Dog d = (Dog)a;
// d.lookHome();
//介紹一個關(guān)鍵字 instanceof:判斷前面的引用是否是后面的類型
if (a instanceof Cat){
Cat c = (Cat)a;
c.eat();
c.catchMouse();
}else {
Dog d = (Dog)a;
d.eat();
d.lookHome();
//開發(fā)中很少這樣去調(diào)用子類的特有方法塌忽,比較麻煩
}
}
}
/*
* 多態(tài)的好處:
* a:提高了代碼的維護性(繼承保證)
* b:提高了代碼的擴展性(多態(tài)保證)
* B:案例演示:
* 多態(tài)的好處
* 可以當做形式參數(shù),可以接收任意子類對象
*
* C:多態(tài)的弊端:
* 不能使用子類的特有屬性和行為
**/
class Animal {
public void eat() {
System.out.println("動物要吃東西");
}
}
class Cat extends Animal {
public void eat(){
System.out.println("貓要吃魚");
}
public void catchMouse(){
System.out.println("貓要抓老鼠");
}
}
class Dog extends Animal{
public void eat() {
System.out.println("狗吃肉");
}
public void lookHome(){
System.out.println("狗狗會看家");
}
}