查看原文
其他

【Java编程教程】详解Java 重载

点击关注 👉 Java面试那些事儿 2023-09-01

整理:Java面试那些事儿


如果一个类有多个名称相同但参数不同的方法,则称为方法重载。


如果我们只需要执行一个操作,使用相同的方法名可以增加程序的可读性。


假设你必须执行给定数字的加法,但可以有任意数量的参数,如果你为两个参数编写诸如 a(int,int) 的方法,为三个参数编写 b(int,int,int) 那么它您和其他程序员可能很难理解该方法的行为,因为它的名称不同。


因此,我们执行方法重载以快速找出程序。


# 方法重载的优点


方法重载增加了程序的可读性。


重载方法的不同方式


java中重载方法有两种方式


  1. 通过改变参数的数量

  2. 通过改变数据类型


在 Java 中,仅通过更改方法的返回类型是不可能实现方法重载的。


1)方法重载:改变参数的个数


在这个例子中,我们创建了两个方法,第一个 add() 方法执行两个数字的加法,第二个 add 方法执行三个数字的加法。


在这个例子中,我们正在创建静态方法,这样我们就不需要为调用方法创建实例。关注公众号Java面试那些事儿,获取651页Java面试题


class Adder{ static int add(int a,int b){return a+b;} static int add(int a,int b,int c){return a+b+c;} } class TestOverloading1{ public static void main(String[] args){ System.out.println(Adder.add(11,11)); System.out.println(Adder.add(11,11,11)); }}


输出:

2233


2) 方法重载:改变参数的数据类型


在这个例子中,我们创建了两个数据类型不同的方法。第一个 add 方法接收两个整数参数,第二个 add 方法接收两个双精度参数。


class Adder{ static int add(int a, int b){return a+b;} static double add(double a, double b){return a+b;} } class TestOverloading2{ public static void main(String[] args){ System.out.println(Adder.add(11,11)); System.out.println(Adder.add(12.3,12.6)); }}


输出:

2224.9


Q) 为什么仅通过改变方法的返回类型是不可能实现方法重载的?


在java中,方法重载是不可能通过改变方法的返回类型来实现的,只是因为有歧义。让我们看看歧义是如何产生的:


class Adder{ static int add(int a,int b){return a+b;} static double add(int a,int b){return a+b;} } class TestOverloading3{ public static void main(String[] args){ System.out.println(Adder.add(11,11));}}

输出:


Compile Time Error: method add(int,int) is already defined in class Adder


System.out.println(Adder.add(11,11)); //这里,java如何判断应该调用哪个sum()方法呢?


注意:编译时错误优于运行时错误。关注公众号Java面试那些事儿,获取651页Java面试题,因此,如果您声明具有相同参数的相同方法,java 编译器会呈现编译器时间错误。


我们可以重载 java main() 方法吗?


是的,通过方法重载。通过方法重载,您可以在一个类中拥有任意数量的主要方法。但是JVM调用 main() 方法,该方法只接收字符串数组作为参数。让我们看一个简单的例子:


class TestOverloading4{ public static void main(String[] args){System.out.println("main with String[]");} public static void main(String args){System.out.println("main with String");} public static void main(){System.out.println("main without args");} }


输出:

main with String[]

# 方法重载和类型提升


如果未找到匹配的数据类型,则一种类型将隐式提升为另一种类型。让我们通过下图来理解这个概念:


如上图所示,byte 可以提升为 short、int、long、float 或 double。short 数据类型可以提升为 int、long、float 或 double。char 数据类型可以提升为 int、long、float 或 double 等。


使用 TypePromotion 的方法重载示例


class OverloadingCalculation1{ void sum(int a,long b){System.out.println(a+b);} void sum(int a,int b,int c){System.out.println(a+b+c);}
public static void main(String args[]){ OverloadingCalculation1 obj=new OverloadingCalculation1(); obj.sum(20,20);//现在第二个 int 文字将被提升为 long obj.sum(20,20,20);
} }


输出:

4060


如果找到匹配,使用类型提升的方法重载示例


如果方法中有匹配的类型参数,则不执行类型提升。


class OverloadingCalculation2{ void sum(int a,int b){System.out.println("调用 int arg 方法");} void sum(long a,long b){System.out.println("long arg method invoked");}
public static void main(String args[]){ OverloadingCalculation2 obj=new OverloadingCalculation2(); obj.sum(20,20);//现在调用 int arg sum() 方法 } }


输出:

调用 int arg 方法


在有歧义的情况下使用类型提升方法重载的示例


如果方法中没有匹配的类型参数,并且每个方法都提升相似数量的参数,就会出现歧义。关注公众号Java面试那些事儿,获取651页Java面试题

class OverloadingCalculation3{ void sum(int a,long b){System.out.println("a 方法被调用");} void sum(long a,int b){System.out.println("b 方法被调用");}
public static void main(String args[]){ OverloadingCalculation3 obj=new OverloadingCalculation3(); obj.sum(20,20);//now ambiguity } }


输出:

Output:Compile Time Error



程序员技术交流群


扫码进群记得备注:城市、昵称和技术方向


热门推荐:


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存