浅谈个人对Java多态性的理解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

对于Java的多态性,很多人难以理解,起初我也一样,最近有点点琢磨出来了其中的原理,在此跟大家分享,例子代码也不复杂,相信看完或多或少会有点收获。

多态性可以理解为:给对象一个激励,让对象自行决定应该做出何种响应。(在网上看到的一句话,个人觉得对多态性的概括很全面,个人对多态性的理解也是用这句话来概括。)

刚开始理解这句话可能有点难下面来看例子具体分析。

Java的多态性表现形式有两种,函数重载(overload)和函数覆盖(override,也就是函数重写)。现在理解不了没事,来看例子。

首先:

//多态性之函数(方法)重载
package com.polymorphism;

public class TestPolymorphism{
	//函数1
	private void dosomething() {
		System.out.println("我是无行参函数");
	}
	//函数2
	private void dosomething(int a) {
		System.out.println("我是形参为int类型的函数:"+a);
	}
	//函数3
	private void dosomething(String str) {
		System.out.println("我是形参为String类型的函数:"+str);
	}
	//函数4
	private void dosomething(int a,String str) {
		System.out.println("我是形参为int和String类型的函数:"+a+" "+str);
	}
	//函数5
	private void dosomething(String str,int a) {
		System.out.println("我是形参为String和int类型的函数:"+str+" "+a);
	}
	public static void main(String[] args) {
		TestPolymorphism p=new TestPolymorphism();
		p.dosomething();//第一次调用
		p.dosomething(10);//第二次调用
		p.dosomething("hello");//第三次调用
		p.dosomething(10, "hello");//第四次调用
		p.dosomething("hello", 10);//第五次调用
	}
}

结果:

我是无行参函数
我是形参为int类型的函数:10
我是形参为String类型的函数:hello
我是形参为int和String类型的函数:10 hello
我是形参为String和int类型的函数:hello 10


对于这个TestPolymorphism类,函数也很简单,只不过大家会看到,所有的函数都是同名的,都是dosomething(),那么如果在主函数调用这个函数的话,他怎么知道去调用哪一个呢?然而大家再看看每个函数,是不是有不同的地方呢?如形参个数、形参类型什么的。对,每个函数都跟其他的不一样。在Java中,同一个类里面写多个函数名相同,但是形参类型、个数以及顺序至少有一个不同的函数,就叫做函数重载。如果两个函数一摸一样,那就会出错。

那么,来看主方法的调用,(虽然p是一个TestPolymorphism类的引用,指向这个类的一个对象,但习惯上的叫法就叫p对象)先创建p这个对象。

第一次调用,这个dosomething()没有实参,所以p只会找到没有形参的函数,也就是第一个函数然后执行,而不会去执行后面的2、3、4、5函数。

第二次调用,这个dosomething()传入了一个int类型的实参10,所以p会找到形参为int类型的函数,也就是第二个函数去执行。

第三次调用,这个dosomething()传入了一个String类型的实参“hello”字符串,所以p会找到形参为String类型的函数,也就是第三个函数去执行。

后面的两个函数调用是类似的情况。

现在再回顾那句话:给对象一个激励,让对象自行决定应该做出何种响应。是不是有一定的体会呢?给p对象一个激励,可以理解为函数的传入实参吧,响应就相当于p对象根据传入的实参去决定执行哪个函数,实现函数体。

PS:函数重写中,虽然可以使两个函数的返回值不同,但是这不足以区分两个方法的重载关系,所以必须通过形参的类型、个数及顺序来构成重载关系。

也许很多人会问,为什么要把函数写成同名的呢,写成不同的名字就不需要这么麻烦了呢?

其实不然,Java中很多时候需要用很多同名的函数,最简单的比如要通过不同的方式来实例化对象,而构造函数名都是相同的,所以这就需要函数重载了。


其次:

//多态性之函数(方法)覆盖(重写)
package com.polymorphism;
class Father{
	protected void dosomething(){
		System.out.println("我是Father的dosomething方法");
	}
}
class Son extends Father{
	protected void dosomething(){
		System.out.println("我是Son的dosomething方法");
	}
}
class Daughter extends Father{
	protected void dosomething(){
		System.out.println("我是Daughter的dosomething方法");
	}
}
public class TestPolymorphism{
	public static void main(String[] args) {
		Father f=new Father();
		f.dosomething();//调用1
		
		Father x=new Son();
		x.dosomething();//调用4
		
		Father y=new Daughter();
		y.dosomething();//调用5
	}
}


结果:

我是Father的dosomething方法
我是Son的dosomething方法
我是Daughter的dosomething方法


类的继承不多讲了,要注意的是子类不能继承父类private属性的变量和函数。

重写:多个子类都需要继承父类的某个方法,如果在每个子类中写一次这个方法,那么就会出现很多次重复的代码,那么会出现代码冗余的现象,所以把这个方法写在父类中,每个子类都继承这个方法,就避免了大量重复代码。但是一般在父类中的方法都是抽象方法,不能实现特定的功能,比如吃东西这个方法eat(),他只是实现吃东西这个动作,并不能实现吃什么东西。那么我要在子类中实现吃饭这个方法,就必须重写eat()方法来实现吃饭这个动作。再比如父类定义了一个画图形的方法draw(),子类要实现画三角形的功能,画三角形也是画图形,也就是说子类的draw()方法本来就有画图形的功能,你只要再写出指定画三角形的代码就行。。也就是说重写其实就是子类重新实现父类某个方法的功能,子类的重写的方法必须跟父类的方法一样(返回值类型、形参类型、形参个数、形参顺序等),但函数体应当不同。

理解了这个,重写就差不多了。

来看例子,很简单。Son和Daughter类都继承Father类并重写了其中的dosomething方法。

调用1都相信大家都能理解,每个对象直接调用自己的方法。

如果把父类引用指向子类对象,也就是x引用,再调用x对象里面的dosomething方法,那这个对象就实现子类的dosomething方法,也就是实现子类所重写的dosomething方法。而不是父类的dosomething方法。对于y引用是一样的。

这也是相当于给对象引用一个激励,让他自己决定去响应哪个激励。给对象引用(父类引用)的激励相当于不同的对象(父类对象或子类对象),响应相当于去执行哪个方法(父类还是子类的方法)。


现在应该能理解了多态性:给对象一个激励,让他自己决定去做出何种响应。

多态性的表现形式:

①同一个类之间:函数重载(overload)

②父类和子类之间:函数覆盖(override)


PS:本人第一次写博文,有什么缺陷或者写的有问题的地方欢迎指点,本人也是菜鸟一只,只是想跟大家共同进步,谢谢!

面向对象特征之三——多态性 1.理解多态性:可以理解为一个事物的多种形态 2.何为多态性: 对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类的引用) 3.多态的使用:虚拟方法调用 有了对象的多态性以后,我们在编译时,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。 子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法确定的(多态性是运行时行为) ... 阅读详情

相关推荐

Java多态理解

Java中,多态是面向对象编程中的一个重要概念,它允许不同类型的对象对同一方法进行不同的实现。具体来说,多态性是指的是通过父类的引用变量来引用子类的对象,从而实现对不同对象的统一操作。

weixin_69053029的博客 553

探索Java中的多态

多态是指同一个方法在不同对象上具有不同的行为。通过多态,程序可以在运行时决定调用哪个方法,从而提高代码的灵活性和可扩展性。多态Java中一个重要且强大的特性,它允许在运行时根据对象的实际类型调用相应的方法,从而提高代码的灵活性和可扩展性。通过方法重载、方法重写、接口和抽象类,可以实现多态,并在实际开发中广泛应用于代码复用、接口回调和工厂模式等场景。希望本文能帮助您更好地理解和应用Java中的多态。如果您有任何问题或建议,欢迎留言讨论。

梦想家星空的博客 906

如何理解Java中的多态

多态(Polymorphism)是面向对象编程的一个重要特性,它指的是一个类的实例(对象)可以表现出多种形态。同时,子类可以扩展或重写父类的方法,以提供不同的行为实现。这意味着,当我们使用父类引用调用一个方法时,实际上会调用相应子类对象的实现(如果已重写该方法)。方法重写(Method Overriding):子类可以重写父类的方法,以提供不同的实现。当子类对象调用重写的方法时,会执行子类的实现,而不是父类的实现。当一个类实现了一个接口时,它必须提供接口中定义的所有方法的实现。方法实现,展现了多态的特性。

weixin_72084017的博客 424

深入理解重写、隐藏、和静、动态绑定的本质

深入理解重写、隐藏、和静、动态绑定的本质 文章目录问题引入重写隐藏动态绑定通俗理解静态绑定总结总结 问题引入 大家都知道成员方法能被继承和重写,那么静态变量或者静态方法能否被子类继承?能否被重写? 于是写了一段代码先验证下: //定义父类 public class SuperClass { static int SuperVar = 10; public static void method(){ System.out.println("this SuperClass");

从左到右 758

解耦 多态性 java_Java多态浅谈

概述Java的四大基本特性:抽象,封装,继承和多态。其中,抽象,封装,继承可以说多态的基础,而多态是封装,继承的具体表现。如果非要用专业术语来描述什么是多态的话多态是指程序中定义的引用变量所指向具体类型和通过该引用变量发出的方法调用在编译的时候并不确定,而是程序运行期间才确定,就是说一个引用变量到底指向哪一个类的实例对象,该引用变量发出的方法调用哪一个类的中的方法,必须在程序运行期间才能确定。记得...

weixin_39849942的博客 178

浅谈Java中的多态性

在面向对象程序设计中多态是一个非常重要的特性,理解多态有利于进行面向对象的分析与设计。 发生多态要有三个前提条件: 继承。多态发生一定要子类和父类之间。 覆盖。子类覆盖了父类的方法。 声明的变量类型是父类类型,但实例则指向子类实例。 如图所示,父类Figure(几何图形)类有一个onDraw(绘图) 方法,Figure(几何图形)它有两个子类Ellipse(椭圆形)和Triangle(三角形)...

蔡政洁的博客 439

浅谈java中extends与implements的区别

Extends可以理解为全盘继承了父类的功能。implements可以理解为为这个类附加一些额外的功能;interface定义一些方法,并没有实现,需要implements来实现才可用。extend可以继承一个接口,但仍是一个接口,也需要implements之后才可用。对于class而言,Extends用于(单)继承一个类(class),而implements用于实现一个接口(interface)

轻锋的专栏 3540

java优先级对接_浅谈Java方法调用的优先级问题

实现Java多态性的时候,关于方法调用的优先级:我们这样假设下,super(超类)、this(当前类对象)、show(方法)、object(对象),方法调用优先顺序: ①this.show(object)>②super.show(object)> ③this.show((super)object)>④super.show((super)object)先看以下代码class Par...

weixin_30335379的博客 158

浅谈C++的多态性 重载 覆盖 隐藏

重载,在一个类定义中,可以编写几个同名的方法,但是只要它们的签名参数列表不同,Java就会将它们看做唯一的方法。简单的说,一个类中的方法与另一个方法同名,但是参数表不同,这种方法称之为重载方法  (百度百科) 严格来说,重载是编译时多态,即静态多态,根据不同类型函数编译时会产生不同的名字如int_foo和char_foo等等,以此来区别调用。故重载仍符合多态定义——通过单一标识支持不同特定行为的

miao6664659的专栏 717

浅谈Java中的Object类

Java编程中,Object类是一个非常重要的类,它是所有类的超类,意味着每个Java类都直接或间接地继承自Object类。b. 谨慎使用clone()方法:clone()方法可以用于创建对象的副本,但需要注意对对象中引用类型的处理。默认的clone()方法执行的是浅拷贝,即对象中的引用类型字段仍然指向原始对象,可能引发意外的副作用。在默认情况下,equals()方法使用的是对象的引用比较。摘要:Java中的Object类是所有类的根类,它提供了一些核心方法和基本行为,为其他类提供了通用的功能。

ynwg1225的博客 668

java多态的特性_浅谈Java三大特性之多态

一、前言这篇讲下三大特性之一的多态,可以通俗得去理解,多种形态,多种姿态。。。那么在面向对象的程序设计中,多态是指什么?Java引用变量有两个类型;一个是编译类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定.如果编译类型和运行时类型不一致,就可能出现所谓的多态(Polymorphism)“多形性”(Polymorphism)从另一个角度将接口从具...

weixin_36471865的博客 253

浅谈Java接口

接口不是类,而是对类的一组需求描述,这些类需要遵从接口描述的统一格式进行定义 Arrays类中的sort方法可以对对象数组进行排序,前提是对象所属类实现了Comparable接口 接口代码: 所以说实现Comparable接口的类必须包含compareTo方法, 接口不能有实例域,实例域和方法应该由实现接口的那个类完成 让类实现接口的两个步骤 将类声明为实现给定的接口 可以是多个,逗号隔开 对接...

hankexin1314的博客 214

浅谈C++中多态java多态机制

所谓的多态即用父类型的指针指向子类对象,然后通过父类的指针调用实际之类的成员函数,因此父类的指针具有多种形态。多态性可以简单地概括为“一个接口,多种方法”,也可以说所是动态绑定。程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。 c++的多态必须通过虚函数来实现,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖。(在C++中重写虚函数才算是体现了多态性

黑暗之神 829

暴力浅谈java的抽象类与接口

       今天闲来无事,翻看了一下《java编程思想》第九章《接口》,一看懵逼!讲的那么复杂难懂,真不知道是我水平低还是这本书翻译的不够通俗易懂,今天刚好有空,完全从一个使用者的角度去讲解抽象类跟接口的使用场景。所写并不权威,纯属个人理解。       抽象类:        首先来看一下抽象我摘取的几句通俗易懂的话        1.抽象类作为很多子类的父类,它是一种模板式设计。  ...

weixin_30267253的博客 309

java 大特性_浅谈Java三大特性

Java三大特性想必大家都不陌生:封装、继承以及多态。很多刚接触Java的小伙伴都会想,它们到底有什么了不得之处,又赋予Java这门编程语言什么魔力呢?今天我们来探讨一下吧~~首先,名词解释:封装,即是隐藏一切可隐藏的东西,对外界只提供最简单的编程接口。比如,在一个类中,把数据和操作方法绑定起来,对数据的访问只能通过这些 get/set 方法(又称为接口)来实现。为什么封装?比如,我是一个厨师,我...

weixin_28756347的博客 238

浅谈java多态重载、构造函数、析构函数理解

转载自品略图书馆http://www.pinlue.com/article/2020/04/2716/2810249523523.html 一、多态性 多态有3个条件 1:继承 2:重写(重写父类继承的方法) 3:父类引用指向字类对象 实例如下: interface Parent { String method(); } class Child1 implem...

yihuliunian的博客 239

Java碎碎念之浅谈多态

大家都知道,面向对象的三大特征为:继承,封装,多态 其中多态较为抽象,以下是我第二次学习javase时的总结(望采纳): 1,理解多态性:可以理解为一个事物的多种形态. 2,何为多态性:对象的多态性:父类引用指向子类对象(或者子类的对象赋给父类引用) 3,多态的使用,虚拟方法的调用 有了对象的多态性以后,我们在编译期间,只能调用父类中声明的方法,但是在运行期间,我们实际执行的则是子类中重写父类的方法. 总结:编译看左边,运行看右边 4,多态性的使用前提: >类的继承关系 >方法的重写 废话少说,

weixin_46255799的博客 162

浅谈java多态

当初学习java多态的时候,是这么描述的:父类引用类型变量指向子类对象。然而菜鸟我根本理解不了, 只知道List list=new ArrayList();这句代码用到了java多态。 现在再重新审视一下这个java多态多态性是指允许不同子类型的对象对同一消息作出不同的响应。 简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。 多态性分为编译时的多态性(方法重载)和运行时的...

混子 281
Tercelman
博客等级 码龄12年 0粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值