浅谈Java面向对象程序设计三大特征之一的 多态

一.什么是多态?

《Java语言程序设计》这本书是这样的解释的:使用父类对象的地方都可以使用子类对象
可能有点懵,讲的通俗一点:
接口实现
一种事物表现出多种形态


二.不如举个"栗子"。

abstract class Animal{
    //抽象方法 吃
    abstract void eat();
}


//定义两个类同继承Animal类:猫 和 狗 . 分别实现eat()抽象方法。(不同的表现形态) 


class Cat extends Animal  {  
 public void eat()  {  
 System.out.println("小鱼干");  
 }  
 public void catchMouse(){
System.out.println("抓老鼠");  }  
}

class Dog extends Animal  {
   public void eat(){ 
 System.out.println("狗粮"); 
 } 
 public void kanJia(){ 
  System.out.println("看门");  
 } 
} 

 
class DuoTaiTest{
  public static void main(String[] args)  {  
  function(new Cat());  
  function(new Dog()); 
  
  Animal animal = new Cat();//向上转型  
  animal.eat();  
  
  Cat c = (Cat)animal;//向下转型  
  c.catchMouse();  

}  

public static void function(Animal animal)  { 
   //传进来的animal是猫是狗,
   //表现出吃的实现是不一样的
   animal.eat();  
   //instanceof 用于子类型有限  
   //或判断所属类型进而使用其特有方法  
   if(animal instanceof Cat)  {  
     Cat c = (Cat)animal; 
     c.catchMouse(); 
    }else if(animal instanceof Dog){ 
       Dog c = (Dog)animal; 
        c.kanJia(); 
      } 
   }  
}     


三.多态的实现

像上面那个栗子。我们只要知道它们  吃(行为的封装这个接口就好。具体他们吃什么我们不管。它们最后猫和狗表现出不同的结果猫吃小鱼干  狗吃狗粮

可以再举个栗子: 我想要一支  去实现 写字() 这个方法,  你可以给我 :毛笔, 圆珠笔, 铅笔等等。 都没关系, 我无非要实现的是    写字() 这个方法。

*************重点在下面,仔细看,认真思考******************************

在刚刚开始就提到了继承在为多态的实现做了准备。子类Cat继承父类Animal,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类Animal对象,也可以处理子类Cat对象,当相同的消息发送给子类或者父类对象时,该对象就会根据自己所属的引用而执行不同的行为,这就是多态。即多态性就是相同的消息使得不同的类做出不同的响应。


实现多态有三个必要条件继承、重写、向上转型。


继承:在多态中必须存在有继承关系的子类和父类。


重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。


向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

     


只有满足了上述三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。


对于Java而言,它多态的实现机制遵循一个原则:当父类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。

四.渣浅析+总结


多态分两种:

(1)   编译时多态(设计时多态):方法重载。

 编译时多态:  function overloading

(2)   运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法则被称为运行时多态。(我们平时说得多的事运行时多态,所以多态主要也是指运行时多态)

运行时多态:  virtual function overriding

多态其实是一种行为的封装,你只需知道你所操纵的对象所能够做的事情(接口),那么你就在需要的时候叫它去做,具体怎么做由它自己去决定,你不需要知道而且没有必要知道。



五。实在看不懂,那么我只能开车带你


猜你喜欢

转载自blog.csdn.net/qq_34927117/article/details/54142587