[JAVA] 什么是多态?多态的使用和代码实现(超详细版)

理解多态

在JAVA中,多态是面向对象编程的重要特征之一,多态意味着在程序中同一个行为具有多种不同的表现形式。

为了更好的理解多态的含义和使用方法,我们可以利用生活中的例子来帮助我们学习

比如一些动物们都有跑,跳,吃等等的通用行为能力,不同的动物针对这些行为的表现形式是不同的

比如狗狗,猫猫,小鸭子他们喜欢吃的东西各有不同,他们的叫声也是不一样的

再比如,当我们按下键盘当中的F1键,针对工作窗口的不同,它也会显示不同的窗口文档

如果在Eclipse编译器下,按下F1键,弹出的是eclipse下的帮助手册

如果在word文档下按下F1键,弹出的是word下的帮助手册

总结:同样的一种行为,在不同的对象上会产生不同的形式结果,这就是生活当中的多态 

而在程序设计当中,意味着允许不同类的对象对同一消息做出不同的响应

JAVA中多态

多态可以分为 编译时多态 和 运行时多态

编译时多态又称设计时多态,指编译器在编译状态就可以进行不同行为的区分,通常我们这种方式是通过方法的重载

运行时多态指的是JAVA程序运行的时,系统才能根据调用方法实例的类型来去决定具体调用哪一个方法

我们一般在JAVA程序中说到的多态,大多指的是运行时多态。

多态实现的两个必要条件:

                    — 满足继承关系

                    — 父类引用指向子类对象

在代码中描述多态功能:

我们可以在开发工具中建立代码块,来向大家讲解多态的具体实现    

以编写动物类代码块为例:

父类Animal:

package Test;

public class Animal {

//动物姓名,月份

private String name;
private int month;

// 方法:吃东西

public  void eat() {
	System.out.println("动物都有吃东西的属性");
}
}

子类Cat:

package Test;

public class Cat extends Animal {
	//属性:体重
   private double weight;
   


//方法:跑动
public void run() {
	System.out.println("小猫爱奔跑");
}

//方法:吃东西(重写父类方法)
public void eat() {
	System.out.println("小猫爱吃鱼");
}

}

子类Dog:

package Test;

public class Dog extends Animal {
	//属性:性别
private String sex;
   
//方法:吃东西
public void eat() {
	   System.out.println("小狗爱吃翔");
   }

//方法:睡觉
   public void sleep() {
	   System.out.println("小狗爱赖床");
   }
}

测试Test类:

package com.ww.test;

import Test.Animal;
import Test.Cat;
import Test.Dog;

public class Test {
	public static void main(String[] args) {
		Animal one=new Animal();//创建引用
		Animal two=new Cat();  //创建引用,指向子类Cat
		Animal three=new Dog();//创建引用,指向子类Dog
	
        //调用共有eat方法,看有什么区别
		one.eat();
		two.eat();
		three.eat();
	}

}

运行显示结果:

从以上代码我们可以得出,以上三个类中都含有eat方法,都是表示吃这一行为,同样是Animal类型的引用

但是随着在具体的运行时,实例化对象的不同,他们的执行结果是不一样的,这就是在JAVA中多态的表现形式

向上转型  (又称隐式转型,自动转型)
  • 我们通过将子类对象向上转型为父类类型,可以用父类类型的变量来引用不同子类的对象。这样,在编写代码时,可以基于父类的通用接口进行操作。
  • 子类对象可以在任何需要父类对象的地方使用,保证了代码的正确性和稳定性。
  • 避免了为每个子类都编写重复的逻辑,减少了代码冗余。

它在代码中的表现形式是;            — 父类引用指向子类实例

       在这里我们把父类看作一个大类,子类看作是父类当中的特定类型,也就是小类的话,那么向上转型就是由小类转大类

Animal one=new Animal();

当我们完成子类向父类转型后,我们就可以调用子类重写父类的方法 或父类派生的能被子类继承的方法

Animal one=new Animal();
Animal two=new Cat();


one.eat( );     //子类重写父类方法
one.setMonth(2); //父类派生,能被子类继承
one.getMonth();  

注:向上转型不可以调用子类独有方法

向下转型(强制类型转换)

  • 当通过父类引用无法直接调用子类特有的方法和属性时,需要进行向下转型来实现。例如,子类中新增了一些父类没有的方法,只有通过向下转型才能调用这些方法。
  • 在某些情况下,需要明确区分不同的子类对象,并对它们进行不同的操作,这就需要先向上转型统一处理,然后在必要时向下转型进行特殊处理。

它在代码中的表现形式是;            — 子类引用指向父类实例

    Animal two =new Cat;
    
    Cat temp=(Cat)two;
    temp.eat();
    temp.run();

子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法,且必须满足转型条件才能进行强转

那么该怎样判断是否满足转型条件呢?

instanceof运算符的用法

这里我们用到了新的运算符instanceof,它主要判断左边的对象是否是它右边的类的实例,如果是,则返回true,否则返回false

 我们可以需要实现向下转型之前,先用instanceof运算符判断,因为它的返回值为布尔型(true和false),所以我们可以用if循环来判断

	if(two instanceof Cat) {
		Cat temp=(Cat)two;
		temp.eat();
		temp.run();
		System.out.println("two可以转换为Cat类型");
	}

运行结果

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值