博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java:Overriding与Overloading
阅读量:6557 次
发布时间:2019-06-24

本文共 2398 字,大约阅读时间需要 7 分钟。

1.Overriding
Overriding
翻译过来是
重写/
覆盖
 
它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。
重写的主要特点是:
1
)方法名必须与被重写方法一致。
 
2
)方法参数列表必须与被重写方法一致。
 
3
)返回类型必须与被重写方法一致。
 
4
重写的方法不能降低原方法的
"
可见度
"
例如:被重写方法为protected void do(int i,double d),
则重写方法可以为protected void do(int i,double d),
或者public void do(int i,double d),
但是不可以是private void do(int i,double d)
 
5
)不能抛出新的异常或者
"
更宽的
"
异常。
例如:被重写方法为public void do(int i,double d) throws IOException,
则重写方法可以为public void do(int i,double d) throws  IOException ,
或者public void do(int i,double d) throws ddeeException(IOException
的子类),但是不可以是public void do(int i,double d) throws Exception,
因为Exception
IOException
的父类,比IOException
"
更宽
"
 
6
)被覆盖的方法不能为private
,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
2.Overloading
Overloading
,翻译成
重载
 
它是指我们可以定义一些名称相同的方法,通过定义不同的输入参数来区分这些方法,然后再调用时,VM
就会根据不同的参数样式,来选择合适的方法执行。
其特点是:
1
)各重载的方法名一致。
 
2
)各重载方法的参数列表不一样(包括参数类型,参数个数,参数顺序3
项中的一项或多项)。
 
3
)返回类型任意。(不能通过方法的返回值来区分重载方法。)
 
4
)访问控制符任意。(不能通过方法的访问权限来区分重载方法。)
 
5
)可以任意抛出自身的异常,而不管被重载方法。(不能通过抛出的异常来区分重载方法。)
 
Overloading
是指“Two or more methods can have the same name if they have different numbers or types of parameters and thus different signatures. ”
显然,对重载的唯一要求就是参数列表必须改变,否则就不是重载了。
3.
类型转换中的重载
在一些情况下,Java 
的自动类型转换也适用于重载方法的自变量。例如,看下面的程序:
// Automatic type conversions apply to overloading.
class
 OverloadDemo {
    
void
 test() {
       System.
out
.println(
"No parameters"
);
    }
 
    
// Overload test for two integer parameters.
    
void
 test(
int
 a, 
int
 b) {
       System.
out
.println(
"a and b: "
 + a + 
" "
 + b);
    }
 
    
// overload test for a double parameter
    
void
 test(
double
 a) {
       System.
out
.println(
"Inside test(double) a: "
 + a);
    }
}
 
class
 Overload {
    
public
 
static
 
void
 main(String args[]) {
       OverloadDemo ob = 
new
 OverloadDemo();
       
int
 i = 88;
       ob.test();
       ob.test(10, 20);
       ob.test(i); 
// this will invoke test(double)
       ob.test(123.2); 
// this will invoke test(double)
    }
}
 
该程序产生如下输出:
No parameters
a and b: 10 20
Inside test(double) a: 88
Inside test(double) a: 123.2
 
在本例中,OverloadDemo 
的这个版本没有定义test(int) 
。因此当在Overload 
内带整数参数调用test()
时,找不到和它匹配的方法。但是,Java 
可以自动地将整数转换为double 
型,这种转换就可以解决这个问题。因此,在test(int) 
找不到以后,Java 
i
扩大到double 
型,然后调用test(double) 
。当然,如果定义了test(int) 
,当然先调用test(int) 
而不会调用test(double) 
。只有在找不到精确匹配时,Java 
的自动转换才会起作用,而且总是找到参数类型最"
匹配"
的方法,即它的形参比实参
且是最
接近
的。
本文转自zhangjunhd51CTO博客,原文链接:http://blog.51cto.com/zhangjunhd/20373,如需转载请自行联系原作者
你可能感兴趣的文章
ubuntu 安装软件
查看>>
微软历史最高市值是多少?
查看>>
二分查找解决数组元素定位问题
查看>>
AHK教程 - imsoft.cnblogs
查看>>
我认为比较有用的快捷键(Eclipse)
查看>>
实战,利用apache来做集群,实现负载均衡
查看>>
实现键值对存储(三):Kyoto Cabinet 和LevelDB的架构比較分析
查看>>
HDU1575:Tr A(矩阵快速幂模板题)
查看>>
javascript 10进制和64进制的转换
查看>>
Castle ActiveRecord框架学习(二):快速搭建简单博客网站
查看>>
关于老鹰主机域名注册续费主机,我购买时遇到的问题
查看>>
Java集合类详解
查看>>
css3 animation 学习
查看>>
2.Java基础之Runtime对象
查看>>
常用的HTML5、CSS3新特性能力检测写法
查看>>
使用 CSS3 动画实现的 3D 图片过渡特效
查看>>
url传参错误的痛
查看>>
第51周三
查看>>
Nginx 变量漫谈(六)
查看>>
Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1)问题解决
查看>>