​ 任何程序语言都具备了一项重要的特性就是对名字的运用。当创建一个对象时,也就给此对象分配到的存储空间取了一个名字。所谓方法则是给某个动作取的名字。通过使用名字你可以引用所有的对象和方法。

​ 将人类语言中存在细微差别的概念映射到程序设计中时,问题随之而生。在日常生活中,相同的词可以表达多种不同的含义----他们被“重载”了,特别时含义含义之间的差别很小时,这种方式非常有用。你可以说“清洗衬衫”,“清洗车”,“清洗狗”。但如果硬要这样说就显得很愚蠢,比如:“以洗衬衫的方式洗衬衫”,“以洗车的方式洗车”,“以洗狗的方式洗狗”。这是因为听众根本不需要对所执行的动作做出明确的区分。大多数人类语言具有很强的冗余性,所以即便漏掉了几个词,任然可以推断出含义。不需要对每个概念都使用不同的词汇----从具体语境中可以推断出含义。


​ 上面这段话,来自《Thinking in Java》。看了之后感觉对方法的重载又有了新的理解,以前在项目中很少会用到方法重载,虽然在源码中经常看到,但是自己用的很少,在别人的代码中也看得很少。

​ 接下来,结合上面这段话我说说自己对重载的理解:

​ 最重要的就是,我们为什么需要对方法进行重载?

  1. 我们没有必要对同样的动作取不同的名字
  2. 即使我们取同样的名字,也有办法区分这两个方法,不管是对我们来说还是对编译器来说

虽然这样说,但是在实际的项目中,我们在写方法时,更多的时候也会注重见名知意,所以我也不建议滥用重载。这也是为什么在项目中重载用的比较少的原因

​ 下面我们来看看如何区分重载的方法,简单总结一句话就是,方法名相同,参数不同,与返回值无关,这里说参数不同,既包括参数的顺序也包括参数的类型,不过一般不建议以参数的顺序区分重载的方法

​ 与返回值类型无关我们可以这样理解,很多时候我们在调用方法的时候,并不关心它的返回值,假设我们现在有两个同名的方法,且参数也相同,如下(假设这种情况是存在的):

  1. public int test01(int a){
  2. System.out.printLn("a");
  3. return a;
  4. }
  5. public void test01(int a){
  6. System.out.printLn("a");
  7. System.out.printLn("a");
  8. }

​ 我们在调用时,可能这样:

  1. int a = test01(10);
  2. test01(10);

​ 这样情况下,编译器好像可以通过返回值来区分不同的方法。但是现在我们设想下面的情况呢?

  1. test01(10);
  2. test(16);

​ 我们在调用的时候,不关心它的返回值,我现在只想调用方法,然后打印值,这种情况下,编译器如何区分不同的方法呢?java是一种强类型的语言,这种情况显然是不行的,违背了java设计的原则。

​ 最后说一下,对于基本数据类型,我们如何区分方法的重载,在上篇文章我们已经知道了,基本数据类型在运算过程中会自动进行转换,那么在方法重载时,情况又是怎么样的呢?

  1. // 情况1:传入的类型小于参数类型
  2. public class Main {
  3. public static void main(String[] args) {
  4. A a = new A();
  5. a.test(1);
  6. a.test(127);
  7. a.test(10000);
  8. a.test(10000000000000L);
  9. a.test(true);
  10. a.test(1.10);
  11. a.test(1.1d);
  12. a.test('a');
  13. }
  14. }
  15. class A {
  16. public void test(int a) {
  17. System.out.println("int:" + a);
  18. }
  19. public void test(byte a) {
  20. System.out.println("byte:" + a);
  21. }
  22. public void test(short a) {
  23. System.out.println("short:" + a);
  24. }
  25. public void test(long a) {
  26. System.out.println("long:" + a);
  27. }
  28. public void test(double a) {
  29. System.out.println("double:" + a);
  30. }
  31. public void test(float a) {
  32. System.out.println("float:" + a);
  33. }
  34. public void test(char a) {
  35. System.out.println("char:" + a);
  36. }
  37. public void test(boolean a) {
  38. System.out.println("boolean:" + a);
  39. }
  40. }

​ 打印结果如下:

  1. int:1
  2. int:127
  3. int:10000
  4. long:10000000000000
  5. boolean:true
  6. double:1.1
  7. double:1.1
  8. char:a

​ 我们可以看到,对于整数类型,默认都会当作int类型处理,如果超出int类型,必须加‘L’(大小写均可)显式告诉编译器这是long类型的数据,如果希望按byte或short类型的数据处理也一样,必须做强制转换,类似这种(byte)10。

JAVA基础篇 之 方法的重载的更多相关文章

  1. java基础学习总结——方法的重载(overload)

    一.方法的重载 方法名一样,但参数不一样,这就是重载(overload). 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样.只要这两方面有其中的一方面不一样就可以构成方法 ...

  2. 小白—职场之Java基础篇

    java基础篇 java基础 目录 1.java是一种什么语言,jdk,jre,jvm三者的区别 2.java 1.5之后的三大版本 3.java跨平台及其原理 4.java 语言的特点 5.什么是字 ...

  3. java基础篇---I/O技术

    java基础篇---I/O技术   对于任何程序设计语言而言,输入输出(I/O)系统都是比较复杂的而且还是比较核心的.在java.io.包中提供了相关的API. java中流的概念划分 流的方向: 输 ...

  4. 金三银四跳槽季,BAT美团滴滴java面试大纲(带答案版)之一:Java基础篇

    Java基础篇: 题记:本系列文章,会尽量模拟面试现场对话情景, 用口语而非书面语 ,采用问答形式来展现.另外每一个问题都附上“延伸”,这部分内容是帮助小伙伴们更深的理解一些底层细节的补充,在面试中可 ...

  5. Java 基础:hashCode方法

    Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket 一.前言 泥瓦匠最近被项目搞的天昏地暗.发现有些要给自己一些目标,关于技术的目标: 专注很重要.专注J ...

  6. Java基础五(方法)

    今日内容介绍1.方法基础知识2.方法高级内容3.方法案例 ###01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. ###02方法的定义格 ...

  7. java基础篇---I/O技术(三)

    接上一篇java基础篇---I/O技术(二) Java对象的序列化和反序列化 什么叫对象的序列化和反序列化 要想完成对象的输入或输出,还必须依靠对象输出流(ObjectOutputStream)和对象 ...

  8. Java基础篇 - 强引用、弱引用、软引用和虚引用

    Java基础篇 - 强引用.弱引用.软引用和虚引用 原创零壹技术栈 最后发布于2018-09-09 08:58:21 阅读数 4936 收藏展开前言Java执行GC判断对象是否存活有两种方式其中一种是 ...

  9. java基础篇 之 构造器内部的多态行为

    java基础篇 之 构造器内部的多态行为 ​ 我们来看下下面这段代码: public class Main { public static void main(String[] args) { new ...

随机推荐

  1. 【Java】标识符 & 命名规则

    Java的标识符和命名规则 什么是标识符[Identifier]? 指用来标识某个实体的一个符号.在不同的应用环境下有不同的含义. 在编程语言中,标识符是开发者编程时使用的名字,对于变量.常量.函数. ...

  2. Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(五)之Controlling Execution

    In Java, the keywords include if-else,while,do-while,for,return,break, and a selection statement cal ...

  3. 第十节:xml、re、logging模块

    XML模块:(用到的时候再看)tree=xml.parse('xmltest.xml')root= tree.getroot()print(root.tag) 打印对象的标签root.attrib 获 ...

  4. stand up meeting 12-10

    今天项目会议正好利用了大家上课前的十五分钟,大家对项目进度和项目中所遇到的问题进行了沟通. 由于天赋同学与重阳小组沟通及时有效,在mapping的过程中直接将单词本中的type与我们单词挑战中的que ...

  5. php+mysql数据库联合查询 left join 右侧数据重复问题

    情况:多表联合查询(三表及以上联合查询) 分析: A left join B left join C left join D 假如: 表B.C.D都与表A关联查询 A left join B 4条数据 ...

  6. v&n赛 内存取证题解(已更新)

    题目是一个raw的镜像文件 用volatility搜索一下进程 有正常的notepad,msprint,还有dumpit和truecrypt volatility -f mem.raw --profi ...

  7. Springboot:第一个Springboot程序(一)

    1.创建Springboot项目 选择创建Springboot项目: 填写项目基本信息: 选择Springboot版本以及web依赖(内嵌tomcat): 创建完成: 创建完成后 等待构建maven项 ...

  8. sk-learn实现L2岭回归,对线性回归正则化

    岭回归算法: from sklearn.datasets import load_boston from sklearn.externals import joblib from sklearn.li ...

  9. Apache漏洞利用与安全加固实例分析

    Apache 作为Web应用的载体,一旦出现安全问题,那么运行在其上的Web应用的安全也无法得到保障,所以,研究Apache的漏洞与安全性非常有意义.本文将结合实例来谈谈针对Apache的漏洞利用和安 ...

  10. MySQL系列(二)

    查看\创建\使用\删除 数据库 用户管理及授权实战 局域网远程连接法 查看\创建\使用\删除\清空\修改 数据库表(是否可空,默认值,主键,自增,外键) 表内容的增删改查 where条件.通配符_%. ...