要理解多态,就必须有一个大的理解方向,不然很容易绕进去。

首先知道多态的释义:多态性是指一个名词可以有多种语义。

  对于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多态的理解的更多相关文章

  1. Java经验杂谈(2.对Java多态的理解)

    多态是面向对象的重要特性之一,我试着用最简单的方式解释Java多态: 要正确理解多态,我们需要明确如下概念:・定义类型和实际类型・重载和重写・编译和运行 其中实际类型为new关键字后面的类型. 重载发 ...

  2. 对java多态的理解

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过 Cat c = new C ...

  3. Java多态-如何理解父类引用指向子类对象

    java多态,如何理解父类引用指向子类对象 要理解多态性,首先要知道什么是“向上转型”. 我定义了一个子类Cat,它继承了Animal类,那么后者就是前者是父类.我可以通过   Cat c = new ...

  4. 考考你对java多态的理解

    请看如下代码, 如果你能不运行得出正确答案, 那你真的超过99%的java程序员了. [本人属于最大头的那部分] public class A{ public String s = "A&q ...

  5. java多态的理解

    面向对象语言中的类有三个特征,封装.继承.多态.封装与继承很好理解,那什么是多态呢? 1.什么是多态? 多态的定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同 ...

  6. java多态的理解----部分非原创

    所谓多态,其实就是对于同一件事情,不同的对象要采取不同的行为,或者同一个对象在不同的情况下需要采取不同的行为方式. 不同的对象要采取不同的行为: 这有两种实现方式:接口实现和子类重新父类方法.这两种实 ...

  7. java四大特性理解(封装继承多态抽象)

    封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...

  8. 深入理解java多态没有烤山药的存在,java就不香了吗?

    目录 1. 从吃烤山药重新认识多态 2. 多态前提条件[重点] 3. 多态的体现 4. 多态动态绑定与静态绑定 5. 多态特性的虚方法(virtual) 7. 向上转型 8. 向下转型 9. 向上向下 ...

  9. Java中的继承、封装、多态的理解

    Java中的继承.封装.多态 继承的理解: 1.继承是面向对象的三大特征之一,也是实现代码复用的重要手段.Java的继承具有单继承的特点,每个子类只有一个直接父类. 2.Java的继承通过extend ...

随机推荐

  1. vim学习、各类插件配置与安装

    vim学习.各类插件配置与安装 vim 插件 配置 1. vim学习 vim基础学习:根据网上流行基础文章<简明Vim练级攻略>,进阶书籍<vim实用技巧>.注:进阶书籍可以在 ...

  2. 对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半。 经过若干次这样的变换,一定会使n变为1

    对于任意大于1的自然数n,若n为奇数,则将n变为3n+1,否则变为n的一半.经过若干次这样的变换,一定会使n变为1.例如,3→10→5→16→8→4→2→1.输入n,输出变换的次数.n≤10 9 .样 ...

  3. Scrapy-多层爬取天堂图片网

    1.根据图片分类对爬取的图片进行分类 开发者选项 --> 找到分类地址         爬取每个分类的地址通过回调函数传入下一层 name = 'sky'start_urls = ['http: ...

  4. CentOs下Mongodb的下载与安装

    1.下载MongoDB(64位) http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz tar zxvf mongodb-lin ...

  5. [Note] Yet Another Resource Negotiator

    Yet Another Resource Negotiator Apache Hadoop YARN 是新一代资源管理调度框架,主要针对 Hadoop MapReduce 1.0 的缺陷做出了改进 M ...

  6. 关于VS2013调试IIS应用源代码时无法进入断点的问题总结

    调试无法进入断点 前言:今天再次遇到之前调试无法进入断点的问题,本来想不写呢觉得没什么只是又犯了同样的错误,但是我发现这个问题我分析起来还是挺费劲的,我仔细想了想原因, 是因为自己对之前的错误没有进行 ...

  7. 3.2 PCI设备的数据传递

    PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设备将进行地址译码,如果当前总线事务使用的地址在某个PCI设备的BAR空间中时,该PCI设备将使 ...

  8. WebService之CXF注解之二(Service接口)

    ITeacherService.java: /** * @Title:ITeacherService.java * @Package:com.you.service * @Description:教师 ...

  9. 使用 pprof 和 Flame-Graph 调试 Golang 应用

    前言 最近用 Golang 实现了一个日志搜集上报程序(内部称 logger 项目),线上灰度测试过程发现 logger 占用 CPU 非常高(80% - 100%).而此项目之前就在线上使用,用于消 ...

  10. Codeforces Round #454 D. Seating of Students

    分三类 1 1: 一个就好了 3 3:特殊讨论下 或 : 第一行奇序号的数放前面,偶序号的数放后面,第二行奇序号的数放前面,偶序号的数放后面,第二行依次类推 有点难写,真的菜 #include< ...