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


目录
相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
77 2
|
7天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
17天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
34 6
|
13天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
18 1
|
26天前
|
JavaScript 前端开发 Java
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
欢迎来到我的博客,我是瑞雨溪,一名热爱JavaScript和Vue的大一学生。如果你从我的文章中受益,欢迎关注我,我将持续更新更多优质内容。你的支持是我前进的动力!🎉🎉🎉
23 0
还不明白面向对象? 本文带你彻底搞懂面向对象的三大特征(2024年11月Java版)
|
1月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
33 4
|
1月前
|
Java 关系型数据库 数据库
面向对象设计原则在Java中的实现与案例分析
【10月更文挑战第25天】本文通过Java语言的具体实现和案例分析,详细介绍了面向对象设计的五大核心原则:单一职责原则、开闭原则、里氏替换原则、接口隔离原则和依赖倒置原则。这些原则帮助开发者构建更加灵活、可维护和可扩展的系统,不仅适用于Java,也适用于其他面向对象编程语言。
32 2
|
2月前
|
存储 Java API
优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。
【10月更文挑战第19天】本文介绍了如何优雅地使用Java Map,通过掌握其高级特性和技巧,让代码更简洁。内容包括Map的初始化、使用Stream API处理Map、利用merge方法、使用ComputeIfAbsent和ComputeIfPresent,以及Map的默认方法。这些技巧不仅提高了代码的可读性和维护性,还提升了开发效率。
92 3
|
2月前
|
存储 安全 Java
Java Map新玩法:深入探讨HashMap和TreeMap的高级特性
【10月更文挑战第19天】Java Map新玩法:深入探讨HashMap和TreeMap的高级特性,包括初始容量与加载因子的优化、高效的遍历方法、线程安全性处理以及TreeMap的自然排序、自定义排序、范围查询等功能,助你提升代码性能与灵活性。
29 2
|
5月前
|
搜索推荐 Java 编译器
【Java探索之旅】多态:重写、动静态绑定
【Java探索之旅】多态:重写、动静态绑定
34 0