关于java多态的理解
要理解多态,就必须有一个大的理解方向,不然很容易绕进去。
首先知道多态的释义:多态性是指一个名词可以有多种语义。
对于java的多态性学习者来说,就是必须要知道多个同名方法在不同情况下的使用规则。
java的同名方法只能通过两种机制实现。覆盖和重载。(覆盖一般出现在继承中,子类覆盖父类,而重载一般出现在同一个类中,参数不同的同名方法,c++中也有)
先探讨重载。
一、我们知道重载需要参数不同,那么不同体现在哪里?
1、参数的个数
2、参数的类型不同
3、参数的位置(这已经包含在上述两者之中)
下面分别体现参数的个数,类型不同引起的重载
public class TestOverload_1 {
public void showMsg() {
System.out.println("a method without parameter");
}
public void showMsg(int k) {//这是对方法的重载
System.out.println("a method parameter with k , k = "+k);
}
public static void main(String args[]) {
TestOverload_1 oa =new TestOverload_1();
oa.showMsg();
oa.showMsg(100);
}
}
public class TestOverload_2 {
public void showMsg(char ch) {
System.out.println("a method with character parameter ch,ch= "+ch);
}
public void showMsg(int k) {
System.out.println("a method with integer parameter k,k= "+k);
}
public static void main(String args[]) {
TestOverload_2 oa = new TestOverload_2();
oa.showMsg('a');
oa.showMsg(3);
}
}
注意:对于静态和普通实例方法的重载是一致的,它们之间也可以相互重载,同理构造方法也能进行重载。,修饰符没有任何限制。
二、关于重载的编译解析原理过程大概如下:
先根据调用的方法名查找是否有该方法--------->比较形参与实参数目,如多个符合,进入候选集---------->从候选集中比较类型是否匹配,如有多个匹配,进入可行集------->查找最佳匹配,如同时存在形参为int 型 与double型方法,选择转换较少的,若转换相同,则报错
源码如下:
public class Matching {
public void show(int a,int b,int c) {
System.out.println("1---a="+a+",b="+b+",c="+c);
}
public void show(int a,int b,double c) {
System.out.println("2---a="+a+",b="+b+",c="+c);
}
public void show(int a,double b,double c) {
System.out.println("3---a="+a+",b="+b+",c="+c);
}
public void show(double a,double b, int c) {
System.out.println("4---a="+a+",b="+b+",c="+c);
}
public void call() {
show(1, 2, 3);//匹配第一个
// show(1.0, 2.0, 3.0);//没有一个可行的方法
show(1.0, 2, 3);//最佳匹配第四个
// show(1, 2.0, 3);//三,四匹配,但没有最佳,所以不通过
show(1, 2, 3.0f);//匹配第二个
}
}
好了,以上就是关于java多态在重载时的一些规则与原理。关于覆盖的规则与理解在这一篇文章中。
关于java多态的理解的更多相关文章
- Java经验杂谈(2.对Java多态的理解)
多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...
- 对java多态的理解
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...
- Java多态-如何理解父类引用指向子类对象
java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new ...
- 考考你对java多态的理解
请看如下代码, 如果你能不运行得出正确答案, 那你真的超过99%的java程序员了. [本人属于最大头的那部分] public class A{ public String s = "A&q ...
- java多态的理解
面向对象语言中的类有三个特征,封装.继承.多态.封装与继承很好理解,那什么是多态呢? 1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同 ...
- java多态的理解----部分非原创
所谓多态,其实就是对于同一件事情,不同的对象要采取不同的行为,或者同一个对象在不同的情况下需要采取不同的行为方式. 不同的对象要采取不同的行为: 这有两种实现方式:接口实现和子类重新父类方法.这两种实 ...
- java四大特性理解(封装继承多态抽象)
封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...
- 深入理解java多态没有烤山药的存在,java就不香了吗?
目录 1. 从吃烤山药重新认识多态 2. 多态前提条件[重点] 3. 多态的体现 4. 多态动态绑定与静态绑定 5. 多态特性的虚方法(virtual) 7. 向上转型 8. 向下转型 9. 向上向下 ...
- Java中的继承、封装、多态的理解
Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...
随机推荐
- 通过修改注册表设置windows环境变量
开发环境搭建每次都要设置很多环境变量, 一般是通过 [菜单]->[计算机]->[属性]->[高级设置]->[环境变量]进行设置,重装系统后,每次都要设置很多环境变量,很麻烦. ...
- SpringMVC+FreeMarker实现静态资源文件自动添加版本号(md5)
近日切换java开发,开始学习springframework.在实现静态资源文件自动计算版本号的实例时,因为不熟悉框架,走了不少弯路,好在最终解决了问题.这里写篇文章记录一下实现,也希望对大家有些用处 ...
- ErrorKiller:Failed to decode response: zlib_decode(): data error
先更新composer自己,composer self-update 然后再更新依赖关系 composer update
- logback KafkaAppender 写入Kafka队列,集中日志输出.
为了减少应用服务器对磁盘的读写,以及可以集中日志在一台机器上,方便使用ELK收集日志信息,所以考虑做一个jar包,让应用集中输出日志 网上搜了一圈,只发现有人写了个程序在github 地址:https ...
- 天气类API调用的代码示例合集:全国天气预报、实时空气质量数据查询、PM2.5空气质量指数等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 全国天气预报:数据来自国家气象局,可根据地名.经纬度GPS.IP查 ...
- [Note] Stream Computing
Stream Computing 概念对比 静态数据和流数据 静态数据,例如数据仓库中存放的大量历史数据,特点是不会发生更新,可以利用数据挖掘技术和 OLAP(On-Line Analytical P ...
- 基于Python的Flask的开发实战(第二节程序的基本结构)
1.初始化 所有的flask程序都必须创建一个程序实例 web服务器使用wsgi接口协议,把接收客户端的请求都转发给这个程序实例来进行处理.这个程序实例就是flask对象 from flask imp ...
- [HNOI2014]道路堵塞
题目描述 A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有从城市1到城市N ...
- 恢复Mysql丢失的root用户权限
今天安装了某个程序时, 由于程序很傻X的 新建了一个 root@localhost 用户 并把 root权限全部改为了 no 这下 我也 傻X 了.服务器上所有程序都崩溃了. 此时即使用root用 ...
- Visual Studio Code搭建python开发环境
开发Python的环境有很多,原来已经在vs2013上面搭建好python的开发环境了,但是vs2013每次启动都占太多内存(太强大了吧),这下出了vs code,既轻量又酷炫,正好拿来试一试开发py ...