您的位置:首页 > 编程语言 > Java开发

JAVA基础之多态

2016-05-22 13:22 375 查看
多态。

面向对象的第三个特征:多态。

多态:指某种事物的多种存在形态。

对象的多态性:

比如,猫这个事物,也可叫做对象。他肯定具备猫的基本特征,同时也具有动物的基本特征。

这就是猫的多态性,对象的多态性。

简单的意思就是:一个对象对应着不同的类型。

那么多态在代码中的体现形式就是:

父类(动物)或者接口的引用指向其子类对象。

代码如下:

class 动物

{

}

class 猫 extends 动物

{

}

上面就是猫的对象描述,猫是动物,我们将猫和所有动物相同的共性内容抽取到父类动物类中,

猫类描述时,继承动物基本特性。

按照以往的经验我们创建猫类对象时我们是这样写的

猫 x=new 猫();

多态的表现形式即为:

猫 x =new 猫();

动物 x= new 猫();

因为猫有动物的基本特征,他继承了动物类,所以我们可以用动物类(父类)指向这个猫类(子类)对象。

多态的好处:

提高代码的扩展性。

比如: */

abstract class DongWu

{

public abstract void eat();

//public abstract void work();

}

class Cat extends DongWu

{

public void eat()

{

System.out.println("吃鱼");

}

public void work()

{

System.out.println("抓老鼠");

}

}

class Dog extends DongWu

{

public void eat()

{

System.out.println("吃屎");

}

public void work1()

{

System.out.println("看家护院");

}

}

class Pig extends DongWu

{

public void eat()

{

System.out.println("饲料");

}

public void work2()

{

System.out.println("吃饭睡觉打豆豆");

}

}

//上面三种动物(猫,狗,猪)分别继承了动物的基本特征。

class DuoTai

{

public static void main(String[] args)

{

shit(new Cat());

shit(new Dog());

shit(new Pig());

System.out.println("----------");

fit(new Cat());

fit(new Dog());

fit(new Pig());

System.out.println("----------");

DongWu d= new Cat();//这个叫做自动类型提升,将猫类型提升为动物类型。但是特有内容无法访问。

//作用是为了限制对特有功能的访问。

//专业术语叫做:向上转型。

d.eat();

// d.work();当我们用父类类型创建的子类对象的话,子类特有的方法就不能访问。

//如果确实需要访问子类中的特有内容,就必须再将类型转换为猫类型。

System.out.println("----------");

Cat c=(Cat) d;//这叫做向下转型,和强制类型转换很相似。

c.eat();

c.work();//这样再访问子类的特有内容就没有问题了。

//注意:对于转型,至始至终都是子类对象在做着类型的变化。

System.out.println("----------");

fit(new Dog());

}

//在未学习多态之前,我们的创建方法都会是下面这样,用类类型创建对象。这样代码复用性不高且麻烦。

public static void shit(Cat c)

{

c.eat();

c.work();

}

public static void shit(Dog d)

{

d.eat();

d.work1();

}

public static void shit(Pig p)

{

p.eat();

p.work2();

}

//学习多态之后,我们知道所有动物都具有动物的基本特征,我们可以用父类(动物类)来创建。

public static void fit(DongWu a)

{

a.eat();

// a.work();

if (a instanceof Cat)//instanceof:用于判断对象的具体类型,只能用于引用数据类型判断

//通常在向下转型前用于健壮性的判断。(基本上属于必须写)

{

Cat c=(Cat)a;

c.work();

}

else if (a instanceof Dog)

{

Dog d=(Dog)a;

d.work1();

}

else

{

Pig p=(Pig)a;

p.work2();

}

}

}

/*多态的弊端:

前期定义的内容不能使用(调用)后期子类的特有内容。

意思就是以父类为类类型创建的对象不能调研子类类型里的特有方法。

多态的前提:

1.必须有关系。要么继承,要么实现。

2.必须要有覆盖。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: