为什么使用多态?实现多态的有哪些方式?

实现多态的两种方式

  一、什么是多态?

        父类类型的变量指向子类创建的对象,使用该变量调用父类中一个被子类重写的方法,则父类中的方法呈现出不同的行为特征,这就是多态

        简单的来说编译时方法行为表现的是父类中的方法,运行时方法行为表现的是子类中重写该方法的行为特征

二、为什么使用多态?

       1、实现代码的复用,避免代码的冗余;

       2、减少代码之间的关联性,即耦合度,方便后期对代码的修改,功能的改善,不必牵一发而动全身,减少不必要的麻烦;

       3、能够通过重写子类的方法,使不同的对像具有不同的功能,扩展了功能。

       3、举例说明

//哺乳类
piublic class Mammal
	public void move(){
         System.out.println("会移动!");
   }
}
 
//鲸鱼类
public class Whale extends Mammal{
	public void move() {
		System.out.println("靠鱼鳍移动!");
	}
}

//蝙蝠类 
public class Bat extends Mammal{
	public void move() {
		System.out.println("靠翼移动!");
	}
}
 
//如果有很多个哺乳类动物的话,每一次都要重新定义一个move方法,很麻烦且代码冗余影响运行的速度

public class Main{
	
	public static void main(String[] args) {
			Whale whale = new Whale();
			whale.move(); 
                            
            Bat bat = new Bat();
			bat.move(); 
			
	}
	
}

//我们可以这样修改

public class Main{
	
	public static void main(String[] args) {
		
			Mammal mammal1 = new Whale();//使用上转型每次只需要重写子类的方法就可以,不需要重新定义方法		
			Mammal mammal2 = new Bat();
            mammal1.move();
            mammal2.move();
		
	}
}

 

  三、多态的实现方式

          1、上转型对象实现多态

              1.1、上转型对象与下转型对象 

                      上转型对象:子类创建的对象赋值给父类声明变量,则该对象称为上转型对象,这个过程称为对象上转型,对应于                 数据类型转换中的自动类型转换;

                      下转型对象:上转型对象再强制转换为创建该对象的子类类型的对象,即将上转型对象还原为子类对象,对应于数                  据类型转换中的强制类型转换。

                      注意:①上转型对象才能够对象下转型;

public class Test {
	 public static void main(String[] args) {
		 Mammal mammal = new Whale();//下转型对象
		 Whale whale =(Whale) mammal;//下转型对象,还原为鲸鱼类
	}	
}

                                  上转型对象不能操作子类新增的成员变量,不能调用子类新增的方法,因此如果要使用子类新增的属性                                         必须下转型

              1.2、上转型对象实现多态实例

//哺乳类(父类)
public class Mammal{
    public void move(){
    	System.out.println("移动");  
     }
}
//鲸鱼类(继承自哺乳类)
public class Whale extends Mammal{
    public void move(){
    	System.out.println("靠鱼鳍移动");  
	}
}
//测试类
public class Test {
	 public static void main(String[] args) {
	     Mammal mammal = new Whale();//上转型对象,父类类型的变量指向子类声明的对象
         mammal.move();
	}	
}

 

  运行结果:运行结果表现出来的是Mammal里move方法的行为特征,编译时表现为父类的move方法的行为特征 ,多种行为状态,即为                        多态

     2、接口回调实现多态                      

                 2.1、什么是接口回调? 

                      接口回调描述的是一种现象:接口声明的变量指向其实现类实例化的对象,那么该接口变量就可以调用接口中的抽象方法,

                 编译时方法行为表现的是接口中的抽象方法,运行时方法行为表现的是接口实现类中重写该方法的行为特征,即为多态

                 2.2、接口回调实现多态实例

//接口
public interface IMammal {
	void move();
}
public class Whale implements IMammal{
    public void move(){
    	System.out.println("靠鱼鳍移动");  
	}
}
public class Test {
	 public static void main(String[] args) {
		 IMammal mammal = new Whale();
		 mammal.move();
	}	
}

  运行结果:编译时是接口的行为特征,运行时是接口实现类的行为特征

3、接口回调与上转型对象实现多态的区别与联系

    ①上转型对象多态的父类是普通类,接口回调都是父类是接口;

    ②接口回调父类方法更加的简洁,是抽象方法不需要有方法体;

    ③都是编译时显示父类方法行为特征,运行时显示子类行为特征。

 


版权声明:本文为weixin_42867975原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。