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

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


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

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

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

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

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

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

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

public int test01(int a){
System.out.printLn("a");
return a;
}
public void test01(int a){
System.out.printLn("a");
System.out.printLn("a");
}

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

int a  = test01(10);
test01(10);

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

test01(10);
test(16);

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

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

// 情况1:传入的类型小于参数类型
public class Main {
public static void main(String[] args) {
A a = new A();
a.test(1);
a.test(127);
a.test(10000);
a.test(10000000000000L);
a.test(true);
a.test(1.10);
a.test(1.1d);
a.test('a');
}
} class A {
public void test(int a) {
System.out.println("int:" + a);
} public void test(byte a) {
System.out.println("byte:" + a);
} public void test(short a) {
System.out.println("short:" + a);
} public void test(long a) {
System.out.println("long:" + a);
}
public void test(double a) {
System.out.println("double:" + a);
}
public void test(float a) {
System.out.println("float:" + a);
}
public void test(char a) {
System.out.println("char:" + a);
}
public void test(boolean a) {
System.out.println("boolean:" + a);
}
}

​ 打印结果如下:

int:1
int:127
int:10000
long:10000000000000
boolean:true
double:1.1
double:1.1
char:a

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

最新文章

  1. .NET基于Redis缓存实现单点登录SSO的解决方案
  2. [翻译]Shape comparison language[转]
  3. Linux知识扫盲
  4. eclipse 常用快捷键 及 windows快捷键
  5. Pyqt4的对话框 -- 预定义对话框
  6. 开发日记:JsonCSharpHelp
  7. 左右两栏div布局,高度自适应
  8. SpringBoot自定义序列化的使用方式--WebMvcConfigurationSupport
  9. Python特殊方法
  10. test11
  11. Linux内核(4) - 内核学习的心理问题
  12. sorting--codility
  13. UVALive6434_Number Assignment
  14. ZeroClipboard及其原理介绍
  15. [转]blocks编程
  16. mysql utf8方式连接查看表数据乱码的问题
  17. 读 下一代SOA 服务技术与面向服务简明指南
  18. connection reset by peer, socket write error问题排查
  19. Spring常用注解用法总结
  20. java lamda

热门文章

  1. 使用Network Emulator Toolkit工具模拟网络丢包测试(上)
  2. SwiftUI - 一步一步教你使用UIViewRepresentable封装网络加载视图(UIActivityIndicatorView)
  3. AJ学IOS(46)之网易彩票幸运大转盘
  4. 【转】Centos7启动网卡(获取ip地址)
  5. D - A Game with Traps-- codeforces 1260D A
  6. js拼接onclick方法字符串参数解决方法
  7. android位运算简单讲解
  8. [Batch脚本] if else 的格式
  9. 透彻理解C++11新特性:右值引用、std::move、std::forward
  10. NPM采用Rust以消除性能瓶颈