Java语法之多态

简介: 上次给大家分享了Java的继承,今天小编给大家分享面向对象三大特性的第三大特性,也就是多态,fighting~~

🎉一.多态


1.1多态的概念

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

多态就是同一个接口,使用不同的实例而执行不同操作,举个例子,生活中的榨汁机,我们都是把水果放到榨汁机中去榨汁,但是你放进去什么水果,它就榨出来相对于的果汁,榨汁是一种行为,榨出来不同的的果汁就是不同的表现形式,希望这个例子可以帮助大家理解!

53ee22bccb2c4297b947bdcd2ac2c092.png


1.2多态的实现条件

👜在J ava 中要实现多态,必须要满足如下几个条件,缺一不可:

1. 必须在继承体系下

2. 子类必须要对父类中方法进行重写

3. 通过父类的引用调用重写的方法


1.3向上转型和向下转型

1)向上转型

向上转型:实际就是创建一个子类对象,将其当成父类对象来使用。

语法格式:父类类型 对象名 = new 子类类型 ()

我们来举个例子:

classAnimal {
publicStringname;
publicintage;
publicvoidsleep() {
System.out.println(name+"正在睡觉!");
    }
}
classDogextendsAnimal {
publicvoidwangwang() {
System.out.println(name+"汪汪叫!");
    }
}
classCatextendsAnimal {
publicvoidmiaomiao() {
System.out.println(name+"喵喵叫!");
    }
}
publicclassTest_1 {
publicstaticvoidmain(String[] args) {
Animalanimal1=newDog();//向上转型animal1.name="汪汪";
animal1.age=3;
animal1.sleep();
Animalanimal2=newCat();//向上转型animal2.name="喵喵";
animal2.age=5;
animal2.sleep();
    }
}

代码里我们可以看到,通过animal1和animal2的引用发生向上转型,同时去给父类中成员赋值和调用方法,这里代码能正常跑起来,但是当我们去调用子类中特有的方法,程序就会报错,由此我们可以得出一个结论:当发生向上转型之后,此时通过父类的引用只能访问父类自己的成员,不能访问到子类特有的成员!!

0dd8c0807f16490399f638d266b32fce.png

向上转型也是发生多态的前提!


补充:

向上转型的另外2中写法

1)方法传参

publicclassTest_1 {
publicstaticvoidfun(Animalanimal){
    }
publicstaticvoidmain(String[] args) {
Dogdog=newDog();
fun(dog);  //这里也发生了向上转型,通过方法的传参    }
}

2)方法的返回值

publicstaticAnimalfun1(){
returnnewDog();
    }//通过方法的返回值发生向上转型

接下来我们要介绍重写:

👜发生重写,必须满足三个条件:

  • 方法名称相同
  • 参数列表相同
  • 返回值相同

例如:

classAnimal {
publicStringname;
publicintage;
publicvoidsleep() {
System.out.println(name+"正在睡觉!");
    }
}
classDogextendsAnimal {
publicvoidwangwang() {
System.out.println(name+"汪汪叫!");
    }
publicvoidsleep(){
System.out.println(name+"重写了父类的sleep!");//发生了重写    }
}
classCatextendsAnimal {
publicvoidmiaomiao() {
System.out.println(name+"喵喵叫!");
    }
}
publicclassTest_1 {
publicstaticvoidmain(String[] args) {
Animalanimal1=newDog();
animal1.name="汪汪";
animal1.age=3;
animal1.sleep();
    }

1972d3f96ebe4e02a98f91d7e356a10f.png

通过运行结果我们可以看到,这里执行的是子类中的方法,这里其实发生了一个动态绑定,它的意思就是Java在编译的时候识别的是父类中的方法,但是在运行的时候绑定到了子类的方法,所以打印出来的结果也就是子类中的结果!

👜发生动态绑定的三个前提:

向上转型

重写

父类和子类有相同的重写方法名


关于动态绑定,大家可以参考这位大佬的blog: 动态绑定和静态绑定!


1.4多态的特性

1. 消除类型之间的耦合关系

2. 可替换性

3. 可扩充性

4. 接口性

5. 灵活性

6. 简化性


🎉总结

我们来看一下发生多态的完整代码

classAnimal {
publicStringname;
publicintage;
publicvoidsleep() {
System.out.println(name+"正在睡觉!");
    }
}
classDogextendsAnimal {
publicvoidwangwang() {
System.out.println(name+"汪汪叫!");
    }
publicvoidsleep() {
System.out.println(name+"正在玩耍");
    }
}
classCatextendsAnimal {
publicvoidmiaomiao() {
System.out.println(name+"喵喵叫!");
    }
@Overridepublicvoidsleep() {
System.out.println(name+"正在和别的猫玩耍");
    }
}
publicclassTest_1 {
publicstaticvoidfunction(Animalanimal) { //发生了多态animal.sleep();
    }
publicstaticvoidmain(String[] args) {
Animalanimal1=newDog();
animal1.name="汪汪";
function(animal1);
Animalanimal2=newCat();
animal2.name="喵喵";
function(animal2);
    }
}

上述代码中可以领悟到多态的思想,在function方法中的sleep行为,我们并不知道这一行为是由哪个对象去执行的,但是我们可以确实当你主方法中给function传参,传的是哪个对象,就执行哪个对象的方法所表现出来的行为,这就相当于一个接口,每个人都可以去使用它,但是每个人所想要的东西都不一样,正如前面给大家举的例子,榨汁机就相当于一个接口,你放什么水果进去,所榨出来的东西是不一样的,也就是所表现出来的行为不一样,这就是多态,多态的美妙之处!!!


多态是Java中一个重要的思想,如对上文有意见或者有错误,还请大佬们斧正,觉得有帮助的童鞋们,创作不易,蟹蟹三连!

目录
相关文章
|
2月前
|
Java
Java基础语法与面向对象
重载(Overload)指同一类中方法名相同、参数列表不同,与返回值无关;重写(Override)指子类重新实现父类方法,方法名和参数列表必须相同,返回类型兼容。重载发生在同类,重写发生在继承关系中。
124 1
|
2月前
|
存储 SQL NoSQL
Redis-常用语法以及java互联实践案例
本文详细介绍了Redis的数据结构、常用命令及其Java客户端的使用,涵盖String、Hash、List、Set、SortedSet等数据类型及操作,同时提供了Jedis和Spring Boot Data Redis的实战示例,帮助开发者快速掌握Redis在实际项目中的应用。
250 1
Redis-常用语法以及java互联实践案例
|
3月前
|
算法 Java 测试技术
零基础学 Java: 从语法入门到企业级项目实战的详细学习路线解析
本文为零基础学习者提供完整的Java学习路线,涵盖语法基础、面向对象编程、数据结构与算法、多线程、JVM原理、Spring框架、Spring Boot及项目实战,助你从入门到进阶,系统掌握Java编程技能,提升实战开发能力。
192 0
|
3月前
|
存储 Java 容器
Java基本语法详解
本文深入讲解了Java编程的基础语法,涵盖数据类型、运算符、控制结构及数组等核心内容,帮助初学者构建坚实的编程基础。
|
4月前
|
Java 数据库连接 数据库
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
本文全面总结了Java核心知识点,涵盖基础语法、面向对象、集合框架、并发编程、网络编程及主流框架如Spring生态、MyBatis等,结合JVM原理与性能优化技巧,并通过一个学生信息管理系统的实战案例,帮助你快速掌握Java开发技能,适合Java学习与面试准备。
204 2
Java 相关知识点总结含基础语法进阶技巧及面试重点知识
|
4月前
|
存储 安全 Java
从基础语法到实战应用的 Java 入门必备知识全解析
本文介绍了Java入门必备知识,涵盖开发环境搭建、基础语法、面向对象编程、集合框架、异常处理、多线程和IO流等内容,结合实例帮助新手快速掌握Java核心概念与应用技巧。
101 0
|
7月前
|
Java 编译器 程序员
java中重载和多态的区别
本文详细解析了面向对象编程中多态与重载的概念及其关系。多态是OOP的核心,分为编译时多态(静态多态)和运行时多态(动态多态)。编译时多态主要通过方法重载和运算符重载实现,如Java中的同名方法因参数不同而区分;运行时多态则依赖继承和方法重写,通过父类引用调用子类方法实现。重载是多态的一种形式,专注于方法签名的多样性,提升代码可读性。两者结合增强了程序灵活性与扩展性,帮助开发者更好地实现代码复用。
276 0
|
8月前
|
缓存 安全 Java
java面试-基础语法与面向对象
本文介绍了 Java 编程中的几个核心概念。首先,详细区分了方法重载与重写的定义、发生阶段及规则;其次,分析了 `==` 与 `equals` 的区别,强调了基本类型和引用类型的比较方式;接着,对比了 `String`、`StringBuilder` 和 `StringBuffer` 的特性,包括线程安全性和性能差异;最后,讲解了 Java 异常机制,包括自定义异常的实现以及常见非检查异常的类型。这些内容对理解 Java 面向对象编程和实际开发问题解决具有重要意义。
|
8月前
|
运维 Cloud Native Java
postman发起post请求遇到报错:java.io.FileNotFoundException (文件名、目录名或卷标语法不正确。)
遇到bug报错,多猜可能的原因,控制变量反复测试,直至找到问题的关键,然后再思考如何解决或者回避。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来
|
10月前
|
Java
Java 面向对象编程的三大法宝:封装、继承与多态
本文介绍了Java面向对象编程中的三大核心概念:封装、继承和多态。
518 15