-
2021-02-13 00:41:13
Java中多态性的实现
什么是多态
面向对象的三大特性:封装、继承、多态。从一定角度来看,封装和继承几乎都是为多态而准备的。这是我们最后一个概念,也是最重要的知识点。
多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
现实中,关于多态的例子不胜枚举。比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
下面是多态存在的三个必要条件,要求大家做梦时都能背出来!
多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象。
多态的好处:
1.可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。如图8.3 所示。图中超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
4.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
Java中多态的实现方式:接口实现,继承父类进行方法重写,同一个类中进行方法重载。
一个小题目:
(一)相关类
class A ...{
public String show(D obj)...{
return ("A and D");
}
public String show(A obj)...{
return ("A and A");
}
}
class B extends A...{
public String show(B obj)...{
return ("B and B");
}
public String show(A obj)...{
return ("B and A");
}
}
class C extends B...{}
class D extends B...{}
(二)问题:以下输出结果是什么?
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨
(三)答案
① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
更多相关内容 -
Java多态性举例说明
2021-02-26 15:10:00Java多态性的概念也可以被说成“一个接口,多个方法”。(一)相关类classA...{publicStringshow(Dobj)...{return("AandD");}publicStringshow(Aobj)...{return("AandA");}}classBextendsA...{publicStringshow(Bobj)....Java多态性的概念也可以被说成“一个接口,多个方法”。
(一)相关类
classA ...{
publicString show(D obj)...{
return("A and D");
}
publicString show(A obj)...{
return("A and A");
}
}
classBextendsA...{
publicString show(B obj)...{
return("B and B");
}
publicString show(A obj)...{
return("B and A");
}
}
classCextendsB...{}
classDextendsB...{}
(二)问题:以下输出结果是什么?
A a1 =newA();
A a2 =newB();
B b =newB();
C c =newC();
D d =newD();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨
(三)答案
① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
(四)分析
①②③比较好理解,一般不会出错。④⑤就有点糊涂了,为什么输出的不是"B and B”呢?!!先来回顾一下多态性。
运行时多态性是面向对象程序设计代码重用的一个最强大机制,Java多态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中Java多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)
好了,先温习到这里,言归正传!实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。让我们来看看它是怎么工作的。
比如④,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A”。
再比如⑧,b.show(c),b是一个引用变量,类型为B,则this为b,c是C的一个实例,于是它到类B找show(C obj)方法,没有找到,转而到B的超类A里面找,A里面也没有,因此也转到第三优先级this.show((super)O),this为b,O为C,(super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是类B的一个对象,因此直接锁定到类B的show(B obj),输出为"B and B”。
按照上面的方法,可以正确得到其他的结果。
问题还要继续,现在我们再来看上面的分析过程是怎么体现出蓝色字体那句话的内涵的。它说:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。还是拿a2.show(b)来说吧。
a2是一个引用变量,类型为A,它引用的是B的一个对象,因此这句话的意思是由B来决定调用的是哪个方法。因此应该调用B的show(B obj)从而输出"B and B”才对。但是为什么跟前面的分析得到的结果不相符呢?!问题在于我们不要忽略了蓝色字体的后半部分,那里特别指明:这个被调用的方法必须是在超类中定义过的,也就是被子类覆盖的方法。B里面的show(B obj)在超类A中有定义吗?没有!那就更谈不上被覆盖了。实际上这句话隐藏了一条信息:它仍然是按照方法调用的优先级来确定的。它在类A中找到了show(A obj),如果子类B没有覆盖show(A obj)方法,那么它就调用A的show(A obj)(由于B继承A,虽然没有覆盖这个方法,但从超类A那里继承了这个方法,从某种意义上说,还是由B确定调用的方法,只是方法是在A中实现而已);现在子类B覆盖了show(A obj),因此它最终锁定到B的show(A obj)。这就是那句话的意义所在,到这里,我们可以清晰的理解Java的多态性了。
-
运行时实现Java的多态性
2021-01-08 19:00:57Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态性的实现。 一、通过继承中超类对象引用变量引用子类对象来实现 举例... -
java多态的理解,java多态简单例子
2021-03-07 10:57:50一、java多态的概念多态,和名字相同,就是表示,某一时刻程序对应着多个可能的状态。在面相对象当中,分成了两种多态。1、编译时多态,主要指的就是方法的重载。2、运行时多态,它主要通过动态绑定来实现。二、java...你知道java多态吗?那么java多态的概念是怎样的呢?一起来看一下什么是java多态,以及java多态代码例子吧!希望可以对你有所帮助哦。
一、java多态的概念
多态,和名字相同,就是表示,某一时刻程序对应着多个可能的状态。
在面相对象当中,分成了两种多态。
1、编译时多态,主要指的就是方法的重载。
2、运行时多态,它主要通过动态绑定来实现。
二、java多态代码实例
下面是一个非常经典的多态实例(java实例):
1、题目
有一个Animal类,它有Cat,和Dog两个子类。
在Animal当中,有个say方法。
在Cat调用这个方法的时,输出小猫喵喵喵。
在Dog调用这个方法的时候,输出小狗汪汪汪。
2、代码实现
父类:Person.javaimport java.util.Scanner;
public class Person
{
public int salary;
public int allSalary()
{
return 0;
}
public static void main(String[] args)
{
Person p = null;
for (int n = 0; n
{
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个1-3的数字:
1 is Teacher
2 is Scientis
3 is Waiter");
int i = sc.nextInt();
//分别指向了不同的子类,输出的结果是不一样的
if (i == 1)
{
p = new Teacher(5000);
System.out.println(p.allSalary());
}
else if (i == 2)
{
p = new Scientist(5000);
System.out.println(p.allSalary());
}
else if (i == 3)
{
p = new Waiter(5000);
System.out.println(p.allSalary());
}
else
{
System.out.println("?
请输入1-3");
}
}
}
}
子类:Scientist .javapublic class Scientist extends Person
{
public Scientist(int salary)
{
this.salary = salary;
}
public int allSalary()
{
int aa = salary * 12 + 36500;
System.out.print("五五开一年的工资:");
return aa;
}
}
Waiter.javapublic class Waiter extends Person
{
public Waiter(int salary)
{
this.salary = salary;
}
public int allSalary()
{
int aa = salary * 12;
System.out.print("服务员一年的工资:");
return aa;
}
}
Teacher .javapublic class Teacher extends Person
{
public Teacher(int salary)
{
this.salary = salary;
}
public int allSalary()
{
int aa = salary * 12 + 3650;
System.out.print("教师一年的工资:");
return aa;
}
}
关于什么是java多态以及多态举例就给大家介绍到这里了,更多相关内容请继续来java入门栏目了解吧。
推荐阅读:
-
Java多态性详细举例说明(很经典例子)
2021-03-01 06:15:58运行时多态性是面向对象程序设计代码重用的一个最强大机制,Java多态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制...(一)相关类
classA ...{
publicString show(D obj)...{
return("A and D");
}
publicString show(A obj)...{
return("A and A");
}
}
classBextendsA...{
publicString show(B obj)...{
return("B and B");
}
publicString show(A obj)...{
return("B and A");
}
}
classCextendsB...{}
classDextendsB...{}
(二)问题:以下输出结果是什么?
A a1 =newA();
A a2 =newB();
B b =newB();
C c =newC();
D d =newD();
System.out.println(a1.show(b)); ①
System.out.println(a1.show(c)); ②
System.out.println(a1.show(d)); ③
System.out.println(a2.show(b)); ④
System.out.println(a2.show(c)); ⑤
System.out.println(a2.show(d)); ⑥
System.out.println(b.show(b)); ⑦
System.out.println(b.show(c)); ⑧
System.out.println(b.show(d)); ⑨
(三)答案
① A and A
② A and A
③ A and D
④ B and A
⑤ B and A
⑥ A and D
⑦ B and B
⑧ B and B
⑨ A and D
(四)分析
①②③比较好理解,一般不会出错。④⑤就有点糊涂了,为什么输出的不是"B and B”呢?!!先来回顾一下多态性。
运行时多态性是面向对象程序设计代码重用的一个最强大机制,Java多态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制。
方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中Java多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。 (但是如果强制把超类转换成子类的话,就可以调用子类中新添加而超类没有的方法了。)
好了,先温习到这里,言归正传!实际上这里涉及方法调用的优先问题 ,优先级由高到低依次为:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。让我们来看看它是怎么工作的。
比如④,a2.show(b),a2是一个引用变量,类型为A,则this为a2,b是B的一个实例,于是它到类A里面找show(B obj)方法,没有找到,于是到A的super(超类)找,而A没有超类,因此转到第三优先级this.show((super)O),this仍然是a2,这里O为B,(super)O即(super)B即A,因此它到类A里面找show(A obj)的方法,类A有这个方法,但是由于a2引用的是类B的一个对象,B覆盖了A的show(A obj)方法,因此最终锁定到类B的show(A obj),输出为"B and A”。
再比如⑧,b.show(c),b是一个引用变量,类型为B,则this为b,c是C的一个实例,于是它到类B找show(C obj)方法,没有找到,转而到B的超类A里面找,A里面也没有,因此也转到第三优先级this.show((super)O),this为b,O为C,(super)O即(super)C即B,因此它到B里面找show(B obj)方法,找到了,由于b引用的是类B的一个对象,因此直接锁定到类B的show(B obj),输出为"B and B”。
按照上面的方法,可以正确得到其他的结果。
问题还要继续,现在我们再来看上面的分析过程是怎么体现出蓝色字体那句话的内涵的。它说:当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。还是拿a2.show(b)来说吧。
a2是一个引用变量,类型为A,它引用的是B的一个对象,因此这句话的意思是由B来决定调用的是哪个方法。因此应该调用B的show(B obj)从而输出"B and B”才对。但是为什么跟前面的分析得到的结果不相符呢?!问题在于我们不要忽略了蓝色字体的后半部分,那里特别指明:这个被调用的方法必须是在超类中定义过的,也就是被子类覆盖的方法。B里面的show(B obj)在超类A中有定义吗?没有!那就更谈不上被覆盖了。实际上这句话隐藏了一条信息:它仍然是按照方法调用的优先级来确定的。它在类A中找到了show(A obj),如果子类B没有覆盖show(A obj)方法,那么它就调用A的show(A obj)(由于B继承A,虽然没有覆盖这个方法,但从超类A那里继承了这个方法,从某种意义上说,还是由B确定调用的方法,只是方法是在A中实现而已);现在子类B覆盖了show(A obj),因此它最终锁定到B的show(A obj)。这就是那句话的意义所在,到这里,我们可以清晰的理解Java的多态性了。
转载:博客园
-
计算机后端-Java-Java核心基础-第13章 面向对象05 18. 多态性使用举例.avi
2022-05-22 07:30:11计算机后端-Java-Java核心基础-第13章 面向对象05 18. 多态性使用举例.avi -
Java的多态性及例子
2022-03-13 21:45:12多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为 对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,... -
java运行时多态性的实现
2021-03-07 10:57:36Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态性的实现。一、通过继承中超类对象引用变量引用子类对象来实现举例... -
Java面向对象特征之多态性
2022-04-09 10:11:00二、使用注意事项三、多态性应用举例三、虚拟方法调用总结 一、多态性是什么? 多态性,是面向对象中最重要的概念,在Java中的体现:对象的多态性: 父类的引用指向子类的对象。可以直接应用在抽象类和接口上 二、... -
Java多态性的复习
2022-03-16 10:43:201.何为多态性 答:可以理解为一个事物的多种形态 2.何为多态性 对象的多态性:父类的引用指向子类的对象 举例: Person p = new Man(); Object obj = new Date(); 3.多态性的使用:虚拟方法调用 3.1:有了... -
day08_08多态性的应用举例
2017-03-26 13:05:10 -
Java程序设计:chapter06 多态性.ppt
2022-06-20 22:21:49Java程序设计:chapter06 多态性.ppt -
java中的多态性
2020-07-07 14:11:23java中的多态性 1.基本概念 多态性,是面向对象中最重要的概念,在Java中的体现: 对象的多态性:父类的引用指向子类的对象 可以直接应用在抽象类和接口上 Java引用变量有两个类型: 编译时类型和 运行时类型。... -
Java运行时多态性的实现
2021-04-08 09:13:55Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译期调用重载方法的机制,下面就继承和接口实现两方面谈谈java运行时多态性的实现。一、通过继承中超类对象引用变量引用子类对象来实现举例... -
【JAVA】多态性特点
2020-08-08 10:11:12计算机运行时,相同的动作可能会在多个不同的类别对象,系统可根据不同类别中的对象,引发对应类别的方法,而有不同的行为。 举例: 猫 通常我们说:猫 cat = new 猫(); 多态中说:动物 animal = new 猫(); 这里的... -
多态性的使用举例
2021-01-29 14:52:49多态性的使用举例: package com.day0125_3; //多态性的使用举例: public class AnimalTest { public static void main(String[] args) { AnimalTest test=new AnimalTest (); test.func(new Dog()); ... -
Java基础巩固系列 多态性的应用举例
2019-03-30 01:34:53代码示例: ...package com.peter.java5; //多态使用的一个例子 public class TestAnimal { public static void main(String[] args) { TestAnimal t = new TestAnimal(); t.func(new Animal()); t.f... -
Java自学习day12-多态性使用举例
2021-05-06 18:07:38//多态性的使用举例一: public class AnimalTest { public static void main(String[] args) { AnimalTest test = new AnimalTest(); test.func(new Dog()); test.func(new Cat()); } public... -
java多态性实例
2015-09-10 10:25:17package java1; import java.util.ArrayList; import java.util.Collection; import java.util.List; public class nicai { public static void main(String args[]) { List alllist=null; Collection al -
Java多态性详解——父类引用子类对象
2021-03-08 03:25:36继承是为了重用父类代码,同时为实现多态性作准备。那么什么是多态呢?方法的重写、重载与动态连接构成多态性。Java之所以引入多态的概念,原因之一是它在类的继承问题上和C++不同,后者允许多继承,这确实给其带来... -
41.Java多态性是什么?怎么理解和使用多态,为什么要用多态?(2.0))
2020-11-17 10:46:571、多态性:即一个事物多种形态 2、实现的两种方式为 1 继承 2 接口 3、实例 Fruit a1 = new Apple(); 这就是多态。 父类new子类。 父类的引用指向子类的对象,Fruit超类new对象时指向子类Apple。 多态只适用... -
JAVA多态性相关知识,看这篇就足够了
2020-02-23 21:23:09面向对象特征之三:多态性 1.理解多态性:可以理解为一个事物的多种形态。 2.何为多态性: 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用) 3. 多态的使用:虚拟方法调用 有了对象的多态性... -
java面向对象的封装性、继承性和多态性
2020-03-20 17:55:58封装性 面向对象的特征一:封装与隐藏 1.为什么要引入封装性? 我们程序设计追求“高内聚,低耦合”。 高内聚 :类的内部数据操作细节自己完成,不允许外部干涉; 低耦合 :仅对外暴露少量的方法用于使用。 隐藏对象... -
java面向对象-多态性
2021-03-27 18:36:471. 多态性的定义 相比于封装和继承,Java多态是三大特性中比较难的一个,封装和继承最后归结于多态, 多态指的是类和类的关系,两个类由继承关系,存在有方法的重写,故而可以在调用时有父类引用指向子类对象。可以... -
JAVA基础-多态性
2022-03-29 19:46:25(多态性) 直白理解父类的引用指向子类的对象 //1、父类引用指向子类对象 //它是一个List对象,有些ArrayList有但是List没有的属性和方法,它就不能再用 //只能用List对象和ArrayList共有的方法 List<... -
多态性的理解
2021-11-30 14:16:09多态性