理解多态
在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类型");
}
运行结果
标签:JAVA,子类,代码,多态,Cat,Animal,父类,eat From: https://blog.csdn.net/2301_79757798/article/details/141094862