/*
1.多态的体现:Animal a=new Cat();
父类的引用a指向了子类的对象new Cat();
父类的引用a可以接收子类的对象new Cat();
2.多态的前提:类与类之间有继承或实现关系。通常还有另外一个:覆盖
3.多态的好处:提高了程序的扩展功能。
4.多态的弊端:只能父类的引用访问父类中的成员;若要访问子类成员需要将引用强转成子类的类型:如Cat c=(Cat) a;
*/
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
void eat()
{
System.out.println("猫吃鱼");
}
void catchMouse()
{
System.out.println("猫抓老鼠");
}
}
class Dog extends Animal
{
void eat()
{
System.out.println("狗啃骨头");
}
void kanJia()
{
System.out.println("狗看家");
}
}
class Test1 //Test1中function方法传进去的是对应的动物类型,如Cat Dog类型,每添加一种动物,都要重载一次对应类型的function方法,
//而Test2中function方法传进去的是Animal类型,只需一个function方法即可,这是多态的一个好处:提高代码复用性
{
public static void main(String[] args)
{
//Cat c =new Cat();
//function(c);
//Dog d=new Dog();
//function(d);
//以上代码等同于以下代码
function(new Cat());
function(new Dog());
}
public static void function(Cat c )
{
c.eat();
c.catchMouse();
}
public static void function(Dog d)
{
d.eat();
d.kanJia();
}
}
class Test2
{
public static void main(String[] args)
{
//Animal c =new Cat();
//function(c);
//Animal d=new Dog();
//function(d);
//以上代码等同于以下代码
function(new Cat());
function(new Dog());
}
public static void function(Animal a)//父类的引用a可以接收子类的对象new Cat()或new Dog()
{
a.eat();
if(a instanceof Cat)//instanceof关键字用于判断传进来的引用是指向哪个对象
{
Cat c=(Cat) a;//因为父类引用只能访问父类成员(重写后的子类成员),所以要将Animal类型的a转换成Cat类型
c.catchMouse();//调用Cat类的特有方法catchMouse();
}
if(a instanceof Dog)
{
Dog d=(Dog) a;//因为父类引用只能访问父类成员(重写后的子类成员),所以要将Animal类型的a转换成Dog类型
d.kanJia();//调用Dog类的特有方法kanJia();
}
}
} |
|