首页 > 编程语言 >Java方法重载

Java方法重载

时间:2023-02-02 21:56:50浏览次数:41  
标签:Java int println add 重载 main 方法

如果一个类中有多个具有相同名称但参数不同的方法,则称为方法重载。如果只需要执行一个操作,具有相同的方法名称将增加程序的可读性。

假设必须执行给定数值的添加操作(求和),但是参数的数量不固定,如果为两个参数编写add1(int,int)方法,为三个参数编写add2(int,int,int)方法,可能对其他程序员来说很难理解这样的方法的行为,因为它的名称不同。

因此,执行方法重载能比较容易理解程序含义。

方法重载的优点

  • 方法重载提高了程序的可读性。

重载方法不同的方式

在java中重载方法有两种方式,它们分别是:

  • 通过改变参数的数量
  • 通过更改数据类型

注意:在java中,只通过更改方法的返回类型来实现方法重载是不可以的。

1. 方法重载: 修改参数的数量

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

在这个例子中,我们创建静态方法,所以不需要创建实例来调用方法。

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));
    }
}
Java

上面代码执行后,输出结果如下 -

22
33
Java

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));
    }
}
Java

上面代码执行后,输出结果如下 -

22
24.9
Java

问题:为什么方法重载不能通过更改方法的返回类型?

在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));// ambiguity
    }
}
Java

上面代码执行后,输出结果如下 -

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

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

注意:编译时错误优于运行时错误。 所以,如果你声明相同的方法具有相同的参数,java编译器渲染编译器时间错误。

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

这是完全可以的。 可以通过方法重载在类中有任意数量的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");}  
}
Java

上面代码执行后,输出结果如下 -

main with String[]
Java

方法重载和类型提升

如果没有找到匹配的数据类型,那么会隐式地将一个类型提升到另一个类型。 让我们通过下面的图示来理解这个概念:

如上图所示,byte可以被提升为shortintlongfloatdoubleshort数据类型可以提升为intlongfloatdoublechar数据类型可以提升为intlongfloatdouble等等。

使用类型提升方法重载的示例

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);// now second int literal will be promoted to long
        obj.sum(20, 20, 20);

    }
}
Java

上面代码执行后,输出结果如下 -

40
60
Java

如果找到匹配使用类型提升方法重载示例
如果方法中存在匹配类型参数,则不会执行类型提升方法重载。

class OverloadingCalculation2 {
    void sum(int a, int b) {
        System.out.println("int arg method invoked");
    }

    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);// now int arg sum() method gets invoked
    }
}
Java

上面代码执行后,输出结果如下 -

Output:int arg method invoked
Java

在模糊的情况下使用类型提升来实现方法重载的示例

如果在方法中没有匹配的类型参数,并且每个方法都会提升相同数量的参数,那么会出现歧义。如下示例代码,将会产生编译时错误。

class OverloadingCalculation3 {
    void sum(int a, long b) {
        System.out.println("a method invoked");
    }

    void sum(long a, int b) {
        System.out.println("b method invoked");
    }

    public static void main(String args[]) {
        OverloadingCalculation3 obj = new OverloadingCalculation3();
        obj.sum(20, 20);// now ambiguity
    }
}
Java

注意: 只有一种类型不被隐式地去提升,例如double不能被隐含地提升到任何类型。

//更多请阅读:https://www.yiibai.com/java/method-overloading-in-java.html#article-start

标签:Java,int,println,add,重载,main,方法
From: https://www.cnblogs.com/cnetsa/p/17087533.html

相关文章

  • 《深入理解Java虚拟机》第三章读书笔记(二)——HotSpot垃圾回收算法实现(OopMap,安全点安
    系列文章目录和关于我前面《深入理解Java虚拟机》第三章读书笔记(一)——垃圾回收算法我们学习了垃圾回收算法理论知识,下面我们关注下HotSpot垃圾回收算法的实现,分为以下几......
  • 使用VSCode创建Maven工程测试Java代码
    使用VSCode创建Maven工程测试Java代码发生缘由使用VSCode创建Maven工程测试Java代码环境介绍电脑系统:win10VSCode版本:1.72.0(usersetup)开始搭建搭建......
  • Java 基础语法
    @目录Java基础语法标识符&关键字数据类型1.数据类型的介绍2.类型转换变量运算符包机制JavaDoc文档注释Scanner类流程控制1.1if选择结构1.2switch(匹配)选择结构2.1......
  • JAVA-基础-包
    java、javax、org、sun包都是jdk提供的类包,且都是在rt.jar中。rt.jar是JAVA基础类库(java核心框架中很重要的包),包含lang在内的大部分功能,而且rt.jar默认就在根classloader的......
  • 细节决定成败:探究Mybatis中javaType和ofType的区别
    开启掘金成长之旅!这是我参与「掘金日新计划·12月更文挑战」的第24天,点击查看活动详情一.背景描述今天,壹哥给学生讲解了Mybatis框架,学习了基础的ORM框架操作及多对一......
  • 防止数据重复提交的6种方法(超简单)!
    有位朋友,某天突然问磊哥:在Java中,防止重复提交最简单的方案是什么?这句话中包含了两个关键信息,第一:防止重复提交;第二:最简单。于是磊哥问他,是单机环境还是分布式环境?得到......
  • django框架之drf:04、序列化器常用字段及参数,序列化器高级用法之source、定制字段数据
    Django框架之drf目录Django框架之drf一、序列化器常用字段及参数1、常用字段2、常用字段参数3、字段参数针对性分类二、序列化器高级用法之source1、定制字段名三、定制......
  • Request-获取请求行数据-方法介绍、代码演示
    Request-获取请求行数据-方法介绍3.request功能:1.获取请求消息数1.获取请求行数据GET/day14/demo1?name=zhangsanHTTP/1.1......
  • Java继承
    Java中的继承是一种机制,表示为一个对象获取父对象的所有属性和行为。在Java中继承是:可以创建基于现有类构建新的类。当您从现有类继承时,就可以重复使用父类的方法和字段......
  • Java this关键字
    在java中,this关键字有很多种用法。在java中,这是一个引用当前对象的引用变量。javathis关键字的用法如下:this关键字可用来引用当前类的实例变量。this关键字可用于调......