首先,什麼是多態?我們應該從什麼角度來理解多態?其實,我們不妨把多態理解成一種事物的多種存在形態,比如,貓和狗都可以變成動物,而動物又可以變成貓和狗。
為了充分理解多態,我們可以從以下這幾個方面來理解多態。
第一、從多態的體現方面:我們使用多態的時候,創建的是父類的引用,開辟的是子類的空間,由於沒有開辟父類的空間,所以是父類的引用指向子類對象,並不是真正的父類自己創建了對象,而且父類對象的引用還可以作為函數參數來接收子類對象哦!
第二、多態實現的前提:必須是類與類之間要有關系,要麼繼承,要麼實現,存在覆蓋,其實就是有抽象函數。
第三、從多態的好處:大大提高程序的可拓展性
第四、多態的應用:1.父類對象的引用指向子類對象,其實本質上是一個向上轉型,就像int轉成double一樣,兒子穿了一身爸爸的衣服,扮成了爸爸。2.但變成了爸爸之後,只能使用爸爸特有的技能,兒子怎麼能夠使用自己本身的技能呢?這時候就需要向下轉型,脫下偽裝,將父類對象的引用強轉成子類類型,就可以使用子類特有的技能了。
第五、多態的弊端:提高了拓展性,但是只能使用父類的引用訪問父類的成員。
------------------------------------------------------------------------------------------例子------------------------------------------------------------------------------------------------
/*
多態:可以理解為事物存在的多種體現形態。
人:男人,女人
動物:貓,狗。
貓 x = new 貓();
動物 x = new 貓();
1,多態的體現
父類的引用指向了自己的子類對象。
父類的引用也可以接收自己的子類對象。
2,多態的前提
必須是類與類之間有關系。要麼繼承,要麼實現。
通常還有一個前提:存在覆蓋。
3,多態的好處
多態的出現大大的提高程序的擴展性。
4,多態的弊端:
提高了擴展性,但是只能使用父類的引用訪問父類中的成員。
5,多態的應用
*/
/*
動物,
貓,狗。
*/
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 貓();
1,多態的體現
父類的引用指向了自己的子類對象。
父類的引用也可以接收自己的子類對象。
2,多態的前提
必須是類與類之間有關系。要麼繼承,要麼實現。
通常還有一個前提:存在覆蓋。
3,多態的好處
多態的出現大大的提高程序的擴展性。
4,多態的弊端:
雖然提高了擴展性,但是只能使用父類的引用訪問父類中的成員。
5,多態的應用
6,多態的出現代碼中的特點(多態使用的注意事項)
第二個問題:如何使用子類特有方法。
*/
/*
動物,
貓,狗。
*/
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 類型(類類型 接口類型)
*/
}
}