黑马程序员_面向对象之--->多态(上)

2014-11-24 10:43:55 · 作者: · 浏览: 3
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
多态:可以理解为事物存在的多种体现形态。
1、多态的体现
父类的引用指向了自己的子类对象
父类的引用也可以接收自己的子类对象
2、多态的前提
必须是类与类之间有关系,要么继承要么实现。
通常还有一个前提:存在覆盖。
3、多态的好处和弊端
好处:多态的出现大大的提高了程序的扩展性
弊端:提高了扩展性,但是只能使用父类的引用访问父类中的成员。
代码演示:
动物:猫,狗
[java]
abstract class Animal
{ www.2cto.com
public abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("eat fish");
}
public void catchMoust()
{
System.out.println("catch mouse");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("eat bone");
}
public void lookHome()
{
System.out.println("look home");
}
}
class Pig extends Animal
{
public void eat()
{
System.out.println("si liao");
}
public void gongDi()
{
System.out.println("gong di");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
/*
Cat c1 = new Cat();
Cat c2 = new Cat();
Pig p = new Pig();
function(c1);
function(new Dog());
function(p);
*/
//Animal c = new Cat();
//c.eat();
//function(new Cat());
//function(new Dog());
//function(new Pig());
Animal a = new Cat();//类型提升,向上转型
a.eat();
//如果想要调用猫的特有方法时,如何操作?
//强制将父类的引用,转成子类类型。
Cat c = (Cat)a;
c.catchMouse();
//千万不要出现这样的操作:将父类对象转成子类类型。
//我们能转换的是父类引用指向了自己的子类对象时,该应用可以提升,也可以被强制转换
//多态自始至终都是子类对象在这这变化
//Animal a = new Animal();
//Cat c = (Cat)a; ---->is error
}

public static void function(Animal a)
{
a.eat();
if(a instanceof Cat)
{
Cat c = (Cat)a;
c.catchMouse();
}else if(a instanceof Dog)
{
Dog d = (Dog)a;
d.lookHome();
}

}
/*
public static void function(Cat c)
{
c.eat();
}
public static void function(Dog d)
{
d.eat();
}
public static void function(Pig p)
{
p.eat();
}
*/
}