世界杯欧洲区预选赛_世界杯足球几年一次 - chinaacecloud.com



[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类型");

}

运行结果