Java面向对象笔记(九)多态

来源:互联网 发布:数据挖掘的技术基础是? 编辑:程序博客网 时间:2024/06/06 04:29

一、什么是多态

多态就是指一个事物具备了多种表现形态

二、多态的体现

①父类的引用指向了自己的子类对象

②父类的引用也可以接受自己的子类对象

二、多态的前提

①必须是类与类之间有关系,要么被继承,要么被实现

②通常存在覆盖(重写)

三、多态的好处

大大的提高了程序的扩展性

例:

//定义一个Animal类描述动物的共性class Animal {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public void eat(){System.out.println("动物吃饭....");}protected void sound(){System.out.println("动物的声音....");}}//Cat类继承Animal类class Cat extends Animal {public void eat(){  //重写父类eat方法System.out.println("猫吃鱼");}public void sound(){System.out.println("喵喵喵");}public void showCat(){System.out.println("I am a cat");}}//Dog类继承Animal类class Dog extends Animal {public void eat(){System.out.println("狗吃骨头");}public void sound(){System.out.println("汪汪汪");}        public void showDog(){System.out.println("I am a dog");}}//动物类测试类class AnimalTest{public static void main(String[] args){//没有使用多态的写法Cat c = new Cat();c.eat();c.sound();Dog d = new Dog();d.eat();d.sound();/*当有了一个新的动物老鼠时,需要重新实例化一个对象,调用老鼠的方法使得代码变得麻烦。*///使用多态的写法,只要是动物就可以调用function()实现功能,//大大的提高了程序的扩展性function(new Cat());function(new Dog());}public static void function(Animal a){a.eat();a.sound();}}

四、多态的弊端

①只能使用父类的引用访问父类中的成员

Animal a = new Cat();  //类型提升,向上转型

这意味着对象a只能访问父类Animal类中存在的成员,而不能访问自己特有的成员。

②如果想要调用猫的特有方法,强制将父类的应用转成子类类型   向下转型

Cat c = (Cat)a;

//将对象a转成Cat型后就可以访问Cat特有的方法

a.showCat();

五、在多态中成员的特点

①成员函数

在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败

Animal a = new Cat();

a.eat();

编译时,a对象调用的方法只能是Animal中存在的方法,否则编译失败

在运行时期:参阅对象所属的类中是否有调用的方法。

Animal a = new Cat();

a.eat();

运行时,a调用的方法是Cat类中重写后的eat()方法

简单总结:成员函数在多态调用时,编译看左边,运行看右边

②成员变量

无论编译还是运行,都参阅引用型变量所属的类中是否存在该成员变量。

即成员变量在多态调用时,都看左边。

③静态成员

在多态中,静态成员函数和变量的调用都看左边。

六、instanceof 关键字

a  instanceof  b   //判断a是否为b的对象

例:

Animal a = new Cat();//判断对象a是否为Cat的实例,若是强制将a转成Cat型,调用Cat特有的方法showCat().if(a instanceof Cat){Cat b = (Cat)a;b.showCat();}


0 0