JAVA函数重载及精确度匹配
来源:互联网 发布:国内旅游2017年大数据 编辑:程序博客网 时间:2024/05/20 09:25
最近看了一个JAVA解惑之重载的案例,感觉挺有意思的,虽然说出来大家可能明白,但有时,可能会“犯错”。
先考虑下面代码的输出:
public class JavaPuzzles {public static void main(String[] args) {JavaPuzzles.printObj(null);}public static void printObj(double[] array){System.out.print("double array");}public static void printObj(Object obj){System.out.println("Object");}}
输出结果:double array ,我们来分析一下。 JAVA函数重载调用一般分为两个步骤:
1、找到所有可用的方法或构造器。 从上面的示例中,我们找到两个,参数类型分别为:double[] 和 Object
2、从1中根据参数类型选择最精确的方法或构造器进行调用。对于null我们事先并不能确定其类型,两个函数都满足条件,数组也是继承自Object所以,double[]比Object具有更高的精确度,于是输出结果就为double array。
进一步考虑:public class JavaPuzzles {public static void main(String[] args) {JavaPuzzles.printObj(null); // 这里会出现编译错误}public static void printObj(double[] array){System.out.print("double array");}public static void printObj(Number number){System.out.print("number");}public static void printObj(Object obj){System.out.println("Object");}}
如果调用重载函数的话,是可以通过编译的。如果调用了会编译通不过,提示:
The method printObj(double[]) is ambiguous for the type JavaPuzzles。
为什么?因为编译的时候,我们不能够确定null到底是什么类型,Number和doubl[]都继承自Object,根本无法区分,于是就出现了编译错误。
于是我们可知,在这种事先不能够明确类型的参数重载调用,只能够发生在父子或多层继承关系中,但不能发生在兄弟或者兄弟子孙间。
例如,因为String继承自Object,而Double继承自Object-->Number,所以显示调用null的时候编译会提示错误。
public static void printObj(Double dbl){System.out.print("double");}public static void printObj(String string){System.out.println("string"); }而因为Double继承自Number,所以调用null的时候,会调用更高精度的函数,即输入double
public static void printObj(Double dbl){System.out.print("double");}public static void printObj(Number number){System.out.println("number");}解函数重载给我们带来了很多的方便,但是有的时候不注意,可能会带来不期望的结果,如果避免此类的问题,可以在调用的时候明确调用参数的精确类型,从而避免问题出现。如
JavaPuzzles.printObj((Number)null);
- JAVA函数重载及精确度匹配
- 函数重载与匹配
- 重载的函数匹配
- C++ 重载函数匹配
- 重载函数模板匹配约定
- 重载函数的最佳匹配
- C++ 函数重载和匹配
- 关于JAVA的精确度
- 关于java重载(重载方法匹配优先级)
- C++学习笔记五——函数重载(多态)、函数模板及函数模板重载和完全匹配与最佳匹配
- JAVA基础day03 循环 函数运用及函数的重载
- C++中的重载函数、重载函数匹配与实参转换
- 黑马程序员Java基础__函数的应用及重载
- 重载函数参数的转换和匹配
- java 除法精确度的问题
- inline 内联函数 constexper 函数 函数重载与函数匹配
- java函数重载 overload
- java 函数重载
- 关于 error LNK2019:无法解析的外部符号 ,该符号在函数**中被引用的思考
- Xcode3与xcode4.2模板对比
- open("/dev/null",o_rdwr)作用
- NodeJs在linux下关闭监听端口
- JavaScript批量验证表单
- JAVA函数重载及精确度匹配
- git优点
- 不能将参数 从“char [260]”转换为“ACHAR *”
- 启动eclipse3.5.1 报错关于org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
- Las Vegas利用ParkPad(基于ArcPad)实现公园资产管理
- s3c2440 nandflash启动过程分析
- 声明
- Ubuntu 10.04 Eclipse C/C++平台搭建
- 程序中如何获取Android的Root权限