深度分析:理解Java中的多态机制,一篇直接帮你掌握
xsobi 2025-01-03 19:37 1 浏览
Java中的多态
1 多态是什么
多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。用白话来说,就是多个对象调用同一个方法,得到不同的结果。
2 多态的语法格式
父类类名 引用名称 = new 子类类名();
当是多态时,该引用名称只能访问父类中的属性和方法,但是访问的时候,会优先访问子类重写以后的方法。
3 满足多态的条件
子类必须继承父类子类必须重写父类的方法父类引用指向子类对象,即:父类类名 引用名称 = new 子类类名();
4 使用多态好处
使用多态可以使代码之间的耦合度降低
减少冗余代码的同时,也使得项目的扩展能力更强
注:耦合度指的是代码(程序)之间的关联程度
5 多态中的类型转换
Java多态中,有两种类型转换:向上转型和向下转型
向上转型向上转型,也叫做自动类型转换,子类型赋值给父类型(父类型的引用指向子类型),构成多态父类类型 引用名称 = new 子类类名();
当使用多态方式调用方法时,该引用名称只能访问父类中的属性和方法。编译器首先检查父类中是否有该方法,如果没有,则编译错误。如果有,再去调用子类的同名(重写)方法。
向下转型向下转型,也叫做强制类型转换,父类型赋值给子类型
当使用多态时,并且访问子类独有的属性或方法时,则必须进行向下转型
当进行向下转型时,建议先使用 instance of 关键字进行判断,判断合法时,则在转为对应的类型,否则可能会出现类型转换异常 java.lang.ClassCastException。
说明:instance of 关键字用于判断一个对象,是否属于某个指定的类或其子类的实例。
6 多态的实现方式
普通子类重写父类方法
接口生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
USB接口也很典型,有了这个,使得接口统一,生活更加方便
抽象类和抽象方法
7 多态简单使用案例
场景:假如有个饲养员,需要给不同的宠物喂食,下面给出使用多态和不使用多态的实现方式。
不使用多态的实现:
首先定义一个抽象类Animal、一个饲养员类AnimalKeeper、一个宠物类Dog和一个宠物类Cat。
public abstract class Animal {
public void eat() {
System.out.println("动物吃东西!");
}
}
/**
* 饲养员
*/
public class AnimalKeeper {
/**
* 给宠物猫喂食
*
* @param cat
*/
public void feed(Cat cat) {
cat.eat();
}
/**
* 给宠物狗喂食
*
* @param dog
*/
public void feed(Dog dog) {
dog.eat();
}
}
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗啃骨头!");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫吃鱼!");
}
}
测试类:
public class PolymorphicTest {
public static void main(String[] args) {
//创建饲养员对象
AnimalKeeper animalKeeper = new AnimalKeeper();
//创建宠物对象
Cat cat = new Cat();
animalKeeper.feed(cat);//猫吃鱼!
Dog dog = new Dog();
animalKeeper.feed(dog);//狗啃骨头!
}
}
以上实现看起来没有什么问题,也容易理解,在目前情况下,饲养员可以满足喂养宠物的需求。但是,过了一周,饲养员又喂养了一只鸟,这时候不得不修改AnimalKeeper类,使其可以饲养宠物鸟,不仅违反了Java中的开闭原则,而且以上代码的实现,扩展性极差。
使用多态的实现:
只需要对以上代码中,饲养员类AnimalKeeper进行替换,新增一个饲养员类AnimalKeeperPolymorphic类。
/**
* 饲养员
*/
public class AnimalKeeperPolymorphic {
/**
* 饲养员给宠物喂食
*
* @param animal
*/
public void feed(Animal animal) {
animal.eat();
}
}
测试用例:
public static void change() {
//创建饲养员对象
AnimalKeeperPolymorphic animalKeeper = new AnimalKeeperPolymorphic();
//创建宠物对象
Cat cat = new Cat();
animalKeeper.feed(cat);//猫吃鱼!
Dog dog = new Dog();
animalKeeper.feed(dog);//狗啃骨头!
}
这种实现有什么好处呢,当新需求来了,需要扩展时,不需要修改饲养员的代码。比如说刚才那个需求,新增加一个宠物鸟,只需要新建一个宠物鸟类,实现Animal接口,不仅遵循了OCP原则,也可以实现饲养宠物鸟的功能。
8 多态分析
以上文中示例代码进行分析,看看多态是如何使用的。
AnimalKeeperPolymorphic中的feed()方法,使用了多态。
当饲养员喂养宠物狗时,其实执行的是:
Animal animal = new Dog();
当饲养员喂养宠物猫时,其实执行的是:
Animal animal = new Cat();
这种属于向上转型,里面有继承(cat继承Animal)关系,重写了父类eat()方法,子类型赋值给父类型(父类型的引用指向子类型),构成了多态。
Animal animal = new Cat(); 程序在编译阶段,animal引用类型被编译器看做Animal类型,所以程序在编译阶段,animal引用绑定的是Aninmal类中的eat()方法,这个过程叫做Java多态的静态绑定。
程序在运行的时候,堆中的对象实际上是Cat类型,而Cat对象已经覆盖(重写)了父类Animal的eat()方法,所以程序在运行阶段,对象绑定的方法是Cat中的eat()方法,这个过程叫做Java多态的动态绑定。
相关推荐
- 听说你还不知道Java代码是怎么运行的?
-
作者:Jay_huaxiao前言作为一名Java程序员,我们需要知道Java代码是怎么运行的。最近复习了深入理解Java虚拟机这本书,做了一下笔记,希望对大家有帮助,如果有不正确的地方,欢迎提出,感激...
- 如何开始学习JAVA编程?
-
#记录我的9月生活#...
- java后端开发需要学什么?
-
Java属于后端开发中最常见的语言之一,Java这种语言的体系比较中立,而且具备了构建多线程的能力,在许多大型互联网平台Java的应用范围特别广泛。 java后端主要涉及到如下4个技术: 第一、S...
- 细思极恐:你真的会写Java吗?
-
导语自2013年毕业后,今年已经是我工作的第4个年头了,总在做java相关的工作,终于有时间坐下来,写一篇关于java写法的一篇文章,来探讨一下如果你真的是一个java程序员,那你真的会写java吗?...
- 七年Java开发的一路辛酸史:分享面试京东、阿里、美团后的心得
-
前言我觉得有一个能够找一份大厂的offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司...
- 我把Java基础编程及思维导图整理的超级详细,小白都能看懂
-
Java基础编程及其思维导图目录:Java学习导图一、Java基本语法1.关键字与标识符2.变量分类3.运算符4.流程控制二、数组1.数组概述2.一维数组3.二维数组4.数组常见算法5....
- Java 开发中的 9 个实用技巧:案例详解
-
Java开发中,总有一些技巧能够帮助我们提高代码质量和开发效率。下面,我们来分享9个Java技巧,每个技巧都附上实际案例,帮助你在工作中立刻应用。1.合理使用final关键字...
- Java 20年,以后将往哪儿走?
-
在今年的Java20周年的庆祝大会中,JavaOne2015的中心议题是“Java的20年”。甲骨文公司Java平台软件开发部的副总裁GeorgesSaab的主题演讲就将关注点放在了java...
- 推荐1个java快速开发项目,让你接私活不用愁
-
??大家好,我是小编南风吹,每天推荐一个小工具/源码,装满你的收藏夹,让你轻松节省开发效率,实现不加班不熬夜不掉头发!...
- 教你用Java开发一个简单的JVM
-
一、前言几年前,接到一个开发任务:用Java开发能运行Java智能合约的虚拟机。在开发Java智能合约时,只能使用智能合约SDK提供的类和一些Java常用类(8种基本数据类型包装类;String、Bi...
- java实战教程(一)软件开发流程&开发模式
-
这里小编为了方便处于不同学习阶段的童鞋,准备了三个系列的文章,java系列教程、java实战教程、java进阶教程,对于刚入坑的童鞋,可以先按照这三个系列教程一步步的了解,循序渐进,java实战系列教...
- Java 核心技术之入门指南:全面解析Java概述
-
大家好,这里是Java码牛!Java核心技术入门:全面解析Java概述一、引言Java,作为一门在当今信息技术领域中被广泛应用于企业级开发的主流编程语言,其核心技术的精准掌握对于众多开发者而言,具有...
- 小白如何轻松上手Java开发?
-
Java,这款流行的编程语言,被广大开发者所钟爱。但对于初学者来说,如何入门确实是一个大问题。尤其对于毫无经验的小白,从何处开始、如何推进,都是关键。本文将带你走进Java的世界,为你揭示从零到一的进...
- 初学Java应该知道的知识点:Java的程序开发是什么?
-
Java的程序开发是什么呢?下面和千锋广州小编一起来看看吧!一般来说,Java的程序开发包括三个步骤:编写程序,编译程序,运行程序编写程序——Java源代码,.Java文件编译程序——Javac用来进...
- 厉害了!全靠经典之作-Java编程思想,把小白教的明明白白
-
今天我们来聊聊这本《Java编程思想》从我学习Java的经验来看,《ThinkinginJava》是讲解Java编程的最佳书籍! 这本书不仅详细地介绍Java语法、知识点、API类库使用,更...
- 一周热门
- 最近发表
- 标签列表
-
- grid 设置 (58)
- 移位运算 (48)
- not specified (45)
- patch补丁 (31)
- 导航栏 (58)
- context xml (46)
- scroll (43)
- dedecms模版 (53)
- c 视频教程下载 (33)
- listview排序 (33)
- firebug 使用 (31)
- characterencodingfilter (33)
- getmonth (34)
- hibernate教程 (31)
- label换行 (33)
- curlpost (31)
- android studio 3 0 (34)
- android应用开发 (31)
- html转js (35)
- 索引的作用 (33)
- css3 0 (31)
- checkedlistbox (34)
- localhost 8080 (32)
- 多态 (32)
- net开发 (31)