java面向对象三大特性,多态篇

简介: 1.概述多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:


1.概述


多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:



多态性是对象多种表现形式的体现😊


多态的优点:


消除类型之间的耦合关系

可替换性

可扩充性

接口性

灵活性

简化性

多态存在的三个必要条件:


继承

重写

父类引用指向子类对象:Parent p = new Child();

左父右子是多态👀


2.方法的多态


重载性质的多态


传入不同的参数,就会调用不同的方法,实现多态🎁


class B {
}
class A extends B {
    public int sum(int n1, int n2) {
        return n1 + n2;
    }
    public int sum(int n1, int n2, int n3) {
        return n1 + n2 + n3;
    }
}


测试类:


A a = new A();
// 这里我们传入不同的参数,就会调用不同的sum方法,实现多态
System.out.println(a.sum(10, 20));
System.out.println(a.sum(10, 20, 30));


重写性质的多态


调用重名方法,但是结果不同,实现多态🎈


class B {
    public void say() {
        System.out.println("B类的say方法被调用");
    }
}
class A extends B {
    public void say() {
        System.out.println("A类的say方法被调用");
    }
}


测试类:


A a = new A();
B b = new B();
// 虽然调用的都是say方法,但是结果不同,实现多态
a.say();
b.say();


3.对象的多态


一个对象的编译类型可以和运行类型不一样👀


Animal animal = new Dog();  // 子类的对象使用父类的引用


此时,我们说编译类型是Animal,运行类型是Dog


编译类型在定义对象时就确定了,不能改变❌运行类型是可以变化的👨


Animal animal = new Dog();  // 子类的对象使用父类的引用,此时运行类型为🐕
animal = new Cat(); // 改变运行类型,改为🐱


编译类型看定义时候 = 的左边,运行类型看 = 的右边😁


4.对象多态的使用


运行的内容要看运行类型


父类:


/**
 * 对象多态的父类
 */
public class ObjectPolymorphicAnimal {
    public void cry() {
        System.out.println("Animal的cry被调用!");
    }
}


子类:


/**
 * 对象多态的子类 - 🐕
 */
public class ObjectPolymorphicDog extends ObjectPolymorphicAnimal{
    public void cry() {
        System.out.println("汪汪汪!");
    }
}


测试类:


/**
 * 对象多态的测试类
 */
public class ObjectPolymorphicTest {
    public static void main(String[] args) {
        ObjectPolymorphicAnimal opa = new ObjectPolymorphicDog();
        opa.cry();  // 汪汪汪!
    }
}
-----------------------------
由于运行类型是Dog类,所以会执行Dog类的cry方法


改变运行类型


针对上面的程序,我们再写一个🐱类子类:


/**
 * 对象多态的子类 - 🐱
 */
public class ObjectPolymorphicCat extends ObjectPolymorphicAnimal{
    public void cry() {
        System.out.println("喵喵喵~");
    }
}


测试类:


// 改变引用的运行类型
opa = new ObjectPolymorphicCat();
opa.cry();  // 喵喵喵~


以上就演示了对象多态的基本入门🚀



5.向上转型


父类类型 引用名 = new 子类类型();


切记,子类必须要重写父类的方法才能被使用,因为编译器编译阶段能调用那些成员是由编译类型决定的👌


而最终的运行效果要看子类(运行类型)的具体实现,即调用方法时,采取从子类开始的就近原则


总结一句话就是:


编译看编译类型(父类),运行看运行类型(子类)🚀


6.向下转型


子类类型 引用名 = (子类类型) 父类引用;


实例:


ObjectPolymorphicAnimal opa = new ObjectPolymorphicCat();  // 我们通过opa是无法访问Cat类没有被重写的方法的
// 那么此时希望调用cat的eatFish方法,采用向下转型
// 注意:向下转型有一个条件,就是父类的引用必须指向的是当前目标类型的对象
// 也就是opa的运行类型必须是ObjectPolymorphicCat!
// 注意:此时的编译类型和运行类型都是ObjectPolymorphicCat
// 类型的强制转换
ObjectPolymorphicCat cat = (ObjectPolymorphicCat) opa;
cat.eatFish();


7.多态中的属性


多态中的属性没有重写一说,结果看编译类型🐱‍🏍


例如父类中有这样一个属性:


int year = 2022;


子类中也有这样一个属性:


int year = 2021;


下面的代码会输出2022:(因为编译类型是ObjectPolymorphicAnimal)


ObjectPolymorphicAnimal opa = new ObjectPolymorphicCat();
// 多态中的属性,看编译类型
System.out.println(opa.year);


8.instanceOf比较操作符


用于判断对象的运行类型是否为XX类型或者XX的子类型

示例:


ObjectPolymorphicAnimal opa = new ObjectPolymorphicCat();
// instanceOf比较操作符
System.out.println(opa instanceof ObjectPolymorphicCat);  // true
System.out.println(opa instanceof ObjectPolymorphicDog);  // false
System.out.println(opa instanceof ObjectPolymorphicAnimal);  // true


目录
相关文章
|
4月前
|
Java API 数据处理
Java新特性:使用Stream API重构你的数据处理
Java新特性:使用Stream API重构你的数据处理
|
4月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
176 1
|
4月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
177 0
Java API 开发者
143 0
|
5月前
|
安全 Java 编译器
Java面向对象
本文深入讲解了Java面向对象编程(OOP)的四大特性:封装、继承、多态与抽象,以及方法的设计与使用。通过示例展示了如何用类和对象组织代码,提升程序的可维护性与扩展性。
|
6月前
|
存储 Java 测试技术
Java基础 - 面向对象
面向对象编程是Java的核心,包含封装、继承、多态三大特性。封装隐藏实现细节,提升代码可维护性与安全性;继承实现类间IS-A关系,支持代码复用;多态通过继承、重写与向上转型,实现运行时方法动态绑定,提升系统扩展性与灵活性。
108 0
|
6月前
|
并行计算 Java API
Java List 集合结合 Java 17 新特性与现代开发实践的深度解析及实战指南 Java List 集合
本文深入解析Java 17中List集合的现代用法,结合函数式编程、Stream API、密封类、模式匹配等新特性,通过实操案例讲解数据处理、并行计算、响应式编程等场景下的高级应用,帮助开发者提升集合操作效率与代码质量。
273 1
|
6月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
680 0
|
Java 编译器
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
Java面向对象(三)详解: 封装 | 继承 | 方法重写 | 抽象类
261 2
|
Java 数据安全/隐私保护
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
Java基础手册二(类和对象 对象创建和使用 面向对象封装性 构造方法与参数传递 this关键字 static关键字 继承 多态 方法覆盖 final关键字 访问控制权限修饰符)
154 0