Java多态

    |     2015年3月30日   |   Java面向对象   |     0 条评论   |    1770

面向对象编程有三大特性:封装、继承、多态。
封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据。对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法。

继承是为了重用父类代码。同时继承也为实现多态做了铺垫。那么什么是多态呢?多态的实现机制又是什么?我们来一一为你揭开:

一、现实生活中的多态

当在浏览器窗口按下F1键会打开一个新的网页
当在Word窗口按下F1键会打开帮助中心
当在Windows下F1弹出的就是Windows 帮助和支持。
同样F1键的行为对应着不同的表现形式和形态,这就是现实生活中多态的一种体现

二、软件世界中的多态

请大家先看一段代码:

class People{
   void say(){
      System.out.println("大家好,我是良民");
   }
}
class Teacher extends People{
    void say(){
      System.out.println("大家好,我是一名老师");
    }
}
public class Demo {
  public static void main(String[] args) {
     People obj = new People(); // 引用父类实例
     obj.say();
     obj = new Teacher(); // 引用子类实例
     obj.say();
  }
}
运行结果:
大家好,我是良民
大家好,我是一名老师

上面的代码,定义了两个类,分别是People 和 Teacher,Teacher 类继承自 People 类。obj 变量的类型为People,它既可以指向People 类的实例,也可以指向 Teacher 类的实例,这是正确的。也就是说,父类的变量可以引用父类的实例,也可以引用子类的实例。
可以看出,obj 既可以是人类,也可以是教师,它有不同的表现形式,这就被称为多态。多态是指一个事物有不同的表现形式或形态。
再比如“宠物”,也有很多不同的表达或实现,它可以是小猫、小狗、蜥蜴等,我们到宠物店说“请给我一只宠物”,服务员给我们小猫、小狗或者蜥蜴都可以,我们就说“宠物”具备了多态性。
思考如下情况:

public static void main(String[] args) {
    Teacher obj = new Teacher();
    obj.say();
    obj = new People ();
    obj.say();
}

注意反过来是错误的,因为所有的教师都是人类,但不是所有的人都是教师。
结论: 在Java中,父类的变量可以引用父类的实例,也可以引用子类的实例。(反之错误)

三、多态存在的三个必要条件

1.要有继承  在多态中必须存在有继承关系的子类和父类。
2.要有重写   子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
3.父类变量引用子类对象   在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

当使用多态方式调用方法时:
首先检查父类中是否有该方法,如果没有,则编译错误;如果有,则检查子类是否覆盖了该方法。
如果子类覆盖了该方法,就调用子类的方法,否则调用父类方法。

对于多态,可以总结以下几点:
1、使用父类类型的引用指向子类的对象;
2、该引用只能调用父类中定义的方法和变量;
3、如果子类中重写了父类中的一个方法,那么在调用这个方法的时候,将会调用子类中的这个方法;

转载请注明来源:Java多态
回复 取消