java之多态的使用

  首先,什么是多态?我们应该从什么角度来理解多态?其实,我们不妨把多态理解成一种事物的多种存在形态,比如,猫和狗都可以变成动物,而动物又可以变成猫和狗。

为了充分理解多态,我们可以从以下这几个方面来理解多态。

第一、从多态的体现方面:我们使用多态的时候,创建的是父类的引用,开辟的是子类的空间,由于没有开辟父类的空间,所以是父类的引用指向子类对象,并不是真正的父类自己创建了对象,而且父类对象的引用还可以作为函数参数来接收子类对象哦!

第二、多态实现的前提:必须是类与类之间要有关系,要么继承,要么实现,存在覆盖,其实就是有抽象函数。

第三、从多态的好处:大大提高程序的可拓展性

第四、多态的应用: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 类型(类类型 接口类型)

*/

}

}

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------