关键词:
文章目录
🍓🍓什么是多态?
在编程语言和类型论中,多态(英语:polymorphism)指为不同数据类型的实体提供统一的接口。 多态类型(英语:polymorphic type)可以将自身所支持的操作套用到其它类型的值上。
面向对象的三大特征:封装性、继承性、多态性,多态性就是多态,多态是在封装的升华,可以说没有封装就么有多态。
extends继承或者implements实现,无论是类与类之间的继承、类与接口之间的实现还是接口与接口间的继承,反正总会出现上下的层次关系,这种关系的产生就是多态性出现的前提。
为了更好的明白什么是多态,来个小demo吧!
🍓🍓多态demo
场景:有学生、老师、超级管理员,难道每一个都要重复写吗,这个岂不是很繁琐,维护起来很困难,若干年后当做diamagnetic重构的时候可能你都不想看你的代码了吧,应该是真的很繁琐,很复杂。
下面我们将创建三个子类【Student、Teacher、Administrator】和一个父类【Person】以及一个测试函数。
父类,包含普通的变量和一个show方法。
Person.java
package DT.demo1;
public class Person
private String name;
private int age;
public Person()
public Person(String name, int age)
this.name = name;
this.age = age;
public String getName()
return name;
public void setName(String name)
this.name = name;
public int getAge()
return age;
public void setAge(int age)
this.age = age;
public void show()
System.out.println(name+","+age+"展示");
学生类,继承父类属性和方法并重写父类show方法
Student.java
package DT.demo1;
public class Student extends Person
@Override
public void show()
System.out.println("学生的信息"+getName()+","+getAge());
老师类,继承父类属性和方法并重写父类show方法
Teacher.java
package DT.demo1;
public class Teacher extends Person
@Override
public void show()
System.out.println("老师的信息"+getName()+","+getAge());
超级管理员类,继承父类属性和方法并重写父类show方法
Administrtors.java
package DT.demo1;
public class Administrtors extends Person
@Override
public void show()
System.out.println("管理员的信息"+getName()+","+getAge());
为了不需要重写我们只需要new出想要的对象然后传入即可。这样就算后面需要添加更多类型的用户也只需要new出对象,控制传入register的参数即可。注意因为main函数是static的,所以下面的register也必须是static类型的。
Test.java
package DT.demo1;
public class Test
public static void main(String[] args)
Student student=new Student();
student.setName("张三");
student.setAge(20);
Teacher teacher=new Teacher();
teacher.setName("李四");
teacher.setAge(22);
Administrtors admin=new Administrtors();
admin.setName("不良使");
admin.setAge(18);
register(student);
register(teacher);
register(admin);
public static void register(Person p)
p.show();
🍓🍓Java多态优势是什么
为了考虑到篇幅和耗时,我们将所有的类写到一个类里面。注意,平时尽量不要这么操作,这里只是为了单纯的图快。
Test.java
package DT.demo2;
// todo 为了方便查看就不把每一个类分开写了 下面都写到这一个Test.java 文件中
public class Test
public static void main(String[] args)
// todo 多态方式创建对象 格式 : Fu fu = new Zi();
Animal animal=new Cat();
// todo 多态方式调用成员变量,编译看左边,运行也看左边
// * 编译看左边 , javac编译的时候会看等号左边父类中有没有这个变量, 如果有编译成功,如果没有,编译失败
// * 运行看左边 , javac编译的时候实际获取的是左边父类中成员变量的值
System.out.println(animal.name); // todo 动物
// 调用成员方法 编译看左边,运行看右边
// * 编译看左边 , javac编译的时候会看等号左边父类中有没有这个变量, 如果有编译成功,如果没有,编译失败
// * 运行看左边 , javac编译的时候实际上运行的是子类中的方法
animal.show(); // todo Cat的show()方法
// 理解
Animal animal1=new Dog();
//现在用animal1是Animal类型,都会默认从Animal这个类中去找
class Animal
String name="动物";
public void show()
System.out.println("Animal的show()方法");
class Cat extends Animal
String name="猫";
@Override
public void show()
System.out.println("Cat的show()方法");
class Dog extends Animal
String name="狗";
@Override
public void show()
System.out.println("Dog的show()方法");
🥭🥭 1、
在多态的形式下,右边的对象可以实现解耦合,便于扩展和维护
例如:
Person person = new Student();
person.work(); // 多态new出来的对象调用woek方法
但是当业务发生了变化时,我需要一个新对象【可以是老师、助教等,但是必须是Person的子类】 只需要修改 new Student();即可
🥭🥭 2、
定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现了多态的扩展性于遍历
任何事物都不是完美无缺的,说完多态的优势,下面我们就来看看多态的劣势吧。
🍓🍓Java多态劣势是什么
不能使用子类的特定功能。
嗯~,其实多态的劣势来源于多态的优势。为什么不修改呢,因为两者是并生的,而多态的优势 > 多态的劣势。任何专业术语,语言特性以及框架的出现都是为了方便性,所以~,你们明白的。
下面来看看多态的劣势吧!
我们可以发现animal对象没有找到lookHome()这个方法,是不是很好奇,我明明new的是子类的Dog的对象,为什么Dog类中的方法却不能调用了呢?
🌹🌹解析:
多态new出来的对象,在调用成员方法和变量的调用和一般常规new出来的对象有些许不同。
变量调用:
编译看左边,运行看左边
🍎🍎编译看左边 , javac编译的时候会看等号左边父类中有没有这个变量, 如果有编译成功,如果没有,编译失败
🍎🍎运行看左边 , javac编译的时候实际获取的是左边父类中成员变量的值
方法调用:
编译看左边,运行看右边
🍎🍎编译看左边 , javac编译的时候会看等号左边父类中有没有这个变量, 如果有编译成功,如果没有,编译失败
🍎🍎运行看左边 , javac编译的时候实际上运行的是子类中的方法
产生原因:
多态new出来的对象方法调用 编译看左边,运行看右边 。而父类没有这个方法,所以new出来的对象自然找不到。承受的范围大了。
解决方案:
向下转型就行了,但是需要注意的是向下转型是不可以随便转的,佛则会报错。
Test.java
package DT.demo3;
public class Test
public static void main(String[] args)
// 堕胎方式创建对象
Animal animal=new Dog();
Dog dog=(Dog)animal;
dog.lookHome();
class Animal
public void eat()
System.out.println("动物在吃饭");
class Dog extends Animal
// 继承重写父类Animal的eat方法
@Override
public void eat()
System.out.println("够吃骨头");
// 狗自带方法,父类没有
public void lookHome()
System.out.println("狗看家");
class Cat extends Animal
// 继承重写父类Animal的eat方法
@Override
public void eat()
System.out.println("猫吃鱼");
// 猫自带方法,父类没有
public void catchMouse()
System.out.println("猫抓老鼠");
觉得有用的可以给个三连,关注一波!!!带你了解更多的Java小知识
Java中抽象和多态的优势[重复]
】Java中抽象和多态的优势[重复]【英文标题】:AdvantagesofAbstractionandPolymorphisminJava[duplicate]【发布时间】:2015-06-2221:27:03【问题描述】:我正在学习Java中的抽象概念。以下是我的理解:抽象是呈现函数签名和隐藏实现的方法,留... 查看详情
java语言中的----多态和异常处理
...态。前面三个我们已经学完了,下面我们来学一下多态。什么是多态?不明思议就是具有两种形态性,一个方法可以定义两种形态,这就是方法的多态性。同时我们还会学习到什么是方法重载、和方法签名。 &nb 查看详情
什么是多态?为什么要使用多态
...话很好理解:Personperson=newStudent("张三");但是这个多态有什么作用呢?而我们又为什么要是有多态呢?首先讲下封装和继承:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,他把实现的细节影藏起来了,比... 查看详情
java的多态(深入版)(代码片段)
...,也不会有多态。那么多态实现的途径和必要条件是什么呢?以及多态中的重写和重载在JVM中的表现是怎么样?在Java中是如何展现继承的特性呢?对于⼦类继承于⽗类时,⼜有什么限 查看详情
js中面向对象的多态
什么是多态: 实际上是不同对象作用与同一操作产生不同的效果。多态的思想实际上是把“想做什么”和“谁去做“分开,多态的好处是什么呢?为什么要多态?我们来看看MartinFowler在《重构:改善既有代码的设计》里写到:&... 查看详情
java多态
...态是继数据抽象和继承之后的第三种形态多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来,多态不但能改善代码的组织结构和可读性,还可以创建可扩展的程序java中所有方法都是通过动态绑定实现多态的,我们可... 查看详情
java封装,继承,多态基础
什么是封装?1,对象数据和在、操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据。2,实际项目开发中,使用封装最多的就是实体类。什么是继承?1,继承是面向对象程序设计能提高效率的重要原因。... 查看详情
java中多态的实现原理(代码片段)
一.什么是多态多态是面向对象编程里面的概念,一个接口的多种不同的实现方式,即为多态。这里的接口不应理解得太死板,比如在Java里面,继承一个类和实现一个接口本质上都是一种继承行为,因此都可以... 查看详情
什么是多态性,使用多态有什么好处?
参考技术A什么是多态?可以这么回答:父类引用引用子类对象父类和子类有同名的覆盖方法通过父类引用调用这个重写的方法的时候。多数的话就可以称为多态,单数可以说运行时绑定。使用多态有什么好处?类调用者对类的... 查看详情
超经典java多态有什么好处?怎样用?
多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是在以后的工作中经常会用到的。多态的表现形式有方法重载,方法改写,多态变量和泛型。重载是一种静态的多态性,在程序编译时确定... 查看详情
java的多态
...态是封装,继承的具体表现。如果非要用专业术语来描述什么是多态的话多态是指程序中定义的引用变量所指向具体类型和通过该引用变量发出的方法调用在编译的时候并不确定,而是程序运行期间才确定,就是说一个引用变量... 查看详情
什么是多态?
多态首先是建立在继承的基础上的,先有继承才能有多态。多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须... 查看详情
如何回答「你的优势和劣势是什么」?面试核心问题6
导读:优势和劣势也是面试中的常问问题,求职者应该有所准备,准备好自己的3个优势和3个劣势。对于优势来说,最好是结合职位要求、或是产品经理的基本能力,谈一些自己具备的和职位相关的优势,... 查看详情
多态及实现方式
...过动态绑定来实现的,也就是大家通常所说的多态性。为什么需要多态?多态的作用:1.提高程序可复用性 首先讲封装和继承:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,他把实现的细节影藏起... 查看详情
什么是多态(polymorphism)?
参考技术A什么是多态?可以这么回答:父类引用引用子类对象父类和子类有同名的覆盖方法通过父类引用调用这个重写的方法的时候。多数的话就可以称为多态,单数可以说运行时绑定。使用多态有什么好处?类调用者对类的... 查看详情
什么是多态性
什么是多态性多态性就是多种表现形式,具体来说,可以用"一个对外接口,多个内在实现方法"表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法... 查看详情
什么是多态,多态的实现方法是什么?
作者:程序狗链接:https://www.zhihu.com/question/30082151/answer/120520568来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。用一句话概括就是:事物在运行过程中存在不同的状态。先以教科书般举例... 查看详情
什么是多态,它是什么,以及它是如何使用的?(代码片段)
什么是多态,它是什么,以及它是如何使用的?答案如果你考虑这个术语的希腊词根,它应该变得明显。Poly=many:polygon=many-sided,polystyrene=manystyrenes(a),polyglot=manylanguages,依此类推。形态=变化或形式:形态=研究生物形态,Mo... 查看详情