java之多態的使用
首先,什么是多態?我們應該從什么角度來理解多態?其實,我們不妨把多態理解成一種事物的多種存在形態,比如,貓和狗都可以變成動物,而動物又可以變成貓和狗。
為了充分理解多態,我們可以從以下這幾個方面來理解多態。
第一、從多態的體現方面:我們使用多態的時候,創建的是父類的引用,開辟的是子類的空間,由於沒有開辟父類的空間,所以是父類的引用指向子類對象,並不是真正的父類自己創建了對象,而且父類對象的引用還可以作為函數參數來接收子類對象哦!
第二、多態實現的前提:必須是類與類之間要有關系,要么繼承,要么實現,存在覆蓋,其實就是有抽象函數。
第三、從多態的好處:大大提高程序的可拓展性
第四、多態的應用:1.父類對象的引用指向子類對象,其實本質上是一個向上轉型,就像int轉成double一樣,兒子穿了一身爸爸的衣服,扮成了爸爸。2.但變成了爸爸之后,只能使用爸爸特有的技能,兒子怎么能夠使用自己本身的技能呢?這時候就需要向下轉型,脫下偽裝,將父類對象的引用強轉成子類類型,就可以使用子類特有的技能了。
第五、多態的弊端:提高了拓展性,但是只能使用父類的引用訪問父類的成員。
多態:可以理解為事物存在的多種體現形態。
人:男人,女人
動物:貓,狗。
貓 x = new 貓();
動物 x = new 貓();
-
多態的體現
父類的引用指向了自己的子類對象。
父類的引用也可以接收自己的子類對象。 -
多態的前提
必須是類與類之間有關系。要么繼承,要么實現。
通常還有一個前提:存在覆蓋。 -
多態的好處
多態的出現大大的提高程序的擴展性。 -
多態的弊端:
提高了擴展性,但是只能使用父類的引用訪問父類中的成員。 -
多態的應用
/* 動物, 貓,狗。 */
abstract class Animal {
abstract void eat();
}
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 kanJia() {
System.out.println("看家");
}
}
class Pig extends Animal {
public void eat() {
System.out.println("飼料");
}
public void gongDi() {
System.out.println("拱地");
}
}
//-----------------------------------------
class DuoTaiDemo
{
public static void main(String[] args)
{
//Cat c = new Cat();
//c.eat();
//Dog d = new Dog();
//d.eat();
//Cat c = new Cat();
/* Cat c1 = new Cat(); function(c1); function(new Dog()); function(new Pig()); */
//Animal c = new Cat();
//c.eat();
function(new Cat());
function(new Dog());
function(new Pig());
}
public static void function(Animal a) {
//Animal a = new Cat();
a.eat();
//a.catchMouse();
}
/* public static void function(Cat c)// { c.eat(); } public static void function(Dog d) { d.eat(); } public static void function(Pig p) { p.eat(); } */
}
多態:可以理解為事物存在的多種體現形態。
人:男人,女人
動物:貓,狗。
貓 x = new 貓();
動物 x = new 貓();
- 多態的體現
父類的引用指向了自己的子類對象。
父類的引用也可以接收自己的子類對象。 - 多態的前提
必須是類與類之間有關系。要么繼承,要么實現。
通常還有一個前提:存在覆蓋。 - 多態的好處
多態的出現大大的提高程序的擴展性。 - 多態的弊端:
雖然提高了擴展性,但是只能使用父類的引用訪問父類中的成員。 - 多態的應用
- 多態的出現代碼中的特點(多態使用的注意事項)
第二個問題:如何使用子類特有方法。
/* 動物, 貓,狗。 */
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 kanJia() {
System.out.println("看家");
}
}
class Pig extends Animal {
public void eat() {
System.out.println("飼料");
}
public void gongDi() {
System.out.println("拱地");
}
}
//-----------------------------------------
class DuoTaiDemo2 {
public static void main(String[] args) {
//Animal a = new Cat();//類型提升。 向上轉型。
//a.eat();
//如果想要調用貓的特有方法時,如何操作?
//強制將父類的引用。轉成子類類型。向下轉型。
///Cat c = (Cat)a;
//c.catchMouse();
//千萬不要出現這樣的操作,就是將父類對象轉成子類類型。
//我們能轉換的是父類應用指向了自己的子類對象時,該應用可以被提升,也可以被強制轉換。
//多態自始至終都是子類對象在做着變化。
// Animal a = new Animal();
// Cat c = (Cat)a;
/* 畢姥爺 x = new 畢老師(); x.講課(); 畢老師 y = (畢老師)x; y.看電影(); */
function(new Dog());
function(new Cat());
}
public static void function(Animal a) {
//Animal a = new Cat();
a.eat();
/* if(a instanceof Animal) { System.out.println("haha"); } else */
if(a instanceof Cat) {
Cat c = (Cat)a;
c.catchMouse();
} else if(a instanceof Dog) {
Dog c = (Dog)a;
c.kanJia();
}
/* instanceof : 用於判斷對象的類型。 對象 intanceof 類型(類類型 接口類型) */
}
}
