这回又是一个大难题,放心Java那点儿事说的都是及角旮旯的问题,每次都不会例外的。或许你已经了解Overload了。
上一个简单的例子
class A {
public static void method(int a) {
System.out.println("int");
}
public static void method(long a) {
System.out.println("long");
}
public static void method(double a) {
System.out.println("double");
}
public static void main(String[] args) {
byte a = 1;
short b = 1;
float c = 24.9f;
long d = 123l;
method(a);
method(b);
method(c);
method(d);
}
}
说说结果,结果是 int int double long 这体现了参数匹配时的自动加宽原则。
byte 和 short 被加宽至 int
long 直接匹配
float 被加宽至 double
这是最简单的,上回说过装箱的问题,如果在重载时装箱与加宽同时存在就会产生问题。来看下面的例子
class A {
public static void method(long a) {
System.out.println("long");
}
public static void method(Integer a) {
System.out.println("Integer");
}
public static void main(String[] args) {
int a = 10;
method(10);
}
}
说说结果吧,结果很不幸的是long,看来编译器更喜欢加宽而不是装箱。咱们继续摸摸编译器的脾气,看下面的例子,看看编译器会怎么办?
class A {
public static void method(Long a) {
System.out.println("Long");
}
public static void main(String[] args) {
int a = 10;
method(10);
}
}
结果先不说,在看看这个例子
class A {
public static void method(Object a) {
System.out.println("Object");
}
public static void main(String[] args) {
int a = 10;
method(10);
}
}
这两个考察的是在面对参数不匹配的时候,编译器是先加宽呢还是先装箱呢? 试过了就知道了,上面的例子无法编译,看来编译器更习惯先装箱再加宽,这一点非常重要的。我们仔细分析一下,第一个例子中int先被装箱为Integer然后进行IS-A检测,Integer NOT IS-A Long 所以编译器找不到匹配的方法就会报错。之后的例子中int 被装箱为Integer又因Integer IS-A Object所以可以完成调用并运行。
var-arg与加宽时的问题。在Java5中可以使用多个参数集,其定义方式为(类型... 名)如int... is,在使用中会遵循数组的使用方式。
class A {
public static void method(long a) {
System.out.println("long");
}
public static void method(int... is) {
System.out.println("int...");
}
public static void main(String[] args) {
int a = 10;
method(10);
}
}
结果不难猜出是long
int...是一种捕获所有的一种能力,这种能力被Java的设计者安排在了最后。
看完了上面这些内容,我再出一个题目,看看能否做出解答
class A{
public static void method(long... ls){
System.out.println("long...");
}
public static void method(Integer... is){
System.out.println("Integer...");
}
public static void main(String[] args){
int i = 10;
method(i);
}
}
出现这样的情况,什么加宽啊,装箱啊,什么规则都没有了。在使用method(i)会提示出错。因为编译器无法确定具体调用哪个方法。
除了上面这个情况,一般来说,重写方法的匹配都尊须一下的原则。
基本类型时加宽操作优先于装箱
基本类型时加宽操作优先于var-arg
var-arg是最后的匹配手段
包装类匹配先装箱在加宽
分享到:
相关推荐
### Java自学之路——超详细含练习项目及源码 #### Java知识体系最强总结 本篇文章旨在根据提供的文件信息,深入解读Java自学之路的关键知识点,并针对其中提到的学习资源进行详细的解析,帮助初学者更好地掌握...
Java 多态性详解 —— 父类引用子类对象 多态性是 Java 面向对象编程的三个特征之一,另外两个是封装和继承。多态性是指通过方法的重写、重载和动态连接来实现的。在 Java 中,多态性是为了解决单继承问题而引入的...
根据提供的文档信息,本文将对Java中的方法、内存结构及方法重载等核心概念进行深入解析。 ### 一、方法(Method) #### 1. 什么是方法 方法是Java编程语言中用于封装特定功能的代码块。它允许程序员将程序划分为...
根据给定文件的信息,我们可以提炼出以下几个...通过以上知识点的梳理,我们可以更好地理解Java中对象的创建、使用及其在内存中的分布情况,以及如何有效地处理方法调用时的参数传递问题和避免常见的空指针异常等问题。
Java 学习第八章——面向对象 #### 面向过程与面向对象的区别 在讨论面向过程和面向对象之前,我们先明确几个概念。编程语言根据其编程范式可以分为多种类型,其中面向过程和面向对象是最常见的两种。 **面向...
### Java编程那些事儿55—方法重载和参数传递 #### 方法重载(Overloading) 在Java编程语言中,**方法重载**(Overloading)是一个非常重要的概念,它允许我们定义多个具有相同名称但参数列表不同的方法。这种方法...
Java方法重载+Java重载案例+Java重载 Java方法重载+Java重载案例+Java重载 Java方法重载+Java重载案例+Java重载 Java方法重载+Java重载案例+Java重载
Java的多态性是面向对象编程(OOP)的三大特性之一,它允许程序设计者以通用的方式处理不同的数据类型,增强了代码的复用性和灵活性。本文将深入探讨Java中的多态性,特别是“父类引用子类对象”的概念,以及这一特性...
在这个“java课程设计实例——java源代码”压缩包中,我们很可能会找到一系列的Java源码文件,这些文件可能涵盖了各种Java编程的基础到高级概念。 首先,"ch01"这个文件名可能是章节的标识,暗示了这个压缩包可能...
这份名为“115个Java面试题和答案——终极(下)(1).rar”的压缩包文件包含了大量Java面试的相关问题及其解答,旨在帮助求职者提升面试表现。文档中的问题涵盖了Java语言的基础知识、进阶特性以及实际开发中的常见...
在Java课程中,小练习通常是为了巩固学生...以上就是"java课上的小练习——计算器"项目中可能涉及的主要Java知识点。通过这个项目,学生可以深入理解Java的基本语法和编程逻辑,同时也能锻炼解决问题和调试代码的能力。
关于函数重载——复数运算的详细代码,有关于函数重载——复数运算所使用主要代码,以及重要的思想 及函数结构
Java 方法的定义和方法的重载 Overload Java 方法是 Java 编程语言的基本组成部分之一。方法是解决问题的多行代码的集合,给予一个名字,以便多次使用。方法的定义和方法的重载是 Java 编程语言的基础知识,本文将...
java代码-使用java解决用this关键字方法重载的源代码 ——学习参考资料:仅用于个人学习使用!
第三题涉及Java访问数据库的方式——JDBC(Java Database Connectivity)。JDBC是一种用于执行SQL语句的标准Java API,允许Java程序与各种关系型数据库管理系统进行通信。它提供了一套标准接口,使得开发者无需关心...
JAVA中的方法重写与方法重载区别 JAVA 中的方法重写和方法重载是两个重要的概念,在面向对象程序设计语言中尤为重要。方法重写和方法重载都是多态性的体现,但它们之间有着本质的区别。 方法重写(Override)是指...
下面我们将详细探讨Java中的方法重载以及内存分配相关的知识点。 首先,我们来解释什么是方法重载。在Java中,如果一个类中有两个或更多的方法拥有相同的名称,但它们的参数列表不同(参数数量、类型或者顺序不同)...
### Java中的方法重载与重写以及线程概念详解 ...通过以上分析可以看出,Java中的方法重载与重写以及线程的概念是Java编程中非常重要的基础知识点,理解并掌握这些概念对于编写高质量的Java应用程序至关重要。