Java方法的重载、可变个数形参、方法参数的值传递机制

简介: Java方法的重载、可变个数形参、方法参数的值传递机制

说完了类和对象,我们再对类的成员中的方法做一个详细的讲解

方法的定义本身比较简单,我在这里就不说了,关于上面提到的类和对象,大家可以参考我上一篇文章:面向对象有那么难吗?一个月搞定面向对象——第一周(1)

一、方法的重载:

什么是重载

我们在编程时,可能有些时候需要用同一个方法名,但是在不同的地方用的时候传递的参数类型以及数量可能不同,里面的内容可能不同,但是方法名是相同的。
那么我们就引入的重载的定义:在同一个类中,允许存在一个以上的同名方法,只要他们的参数类型或数量不同即可。

重载的特点

方法的重载与返回值类型无关,但参数列表必须不同(参数类型以及数量)。调用时,根据调用的方法参数列表的不同来区别。

我们来举个栗子~

public class OverloadExer {
  //1. 如下的三个方法构成重载
  public void mOL(int i){
    System.out.println(i * i);
  }
  public void mOL(int i,int j){
    System.out.println(i * j);
  }
  public void mOL(String s){
    System.out.println(s);
  }
  //2.如下的三个方法构成重载
  public int max(int i,int j){
    return (i > j)? i : j;
  }
  public double max(double d1,double d2){
    return (d1 > d2)? d1 : d2;
  }
  public double max(double d1,double d2,double d3){
    double max = (d1 > d2)? d1 : d2;
    return (max > d3)? max : d3;
  }

**

二、可变个数形参

**

JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定

义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可 变的实参。

//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量 
public static void test(int a ,String[] books); 
//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量 
public static void test(int a ,String…books);

可变个数形参的声明方法:方法名(参数的类型名…参数名)

可变个数形参能识别的参数可以是0个,1个或多个,也就是说,没有参数也可以调用这个方法。

说了这个概念,那究竟要怎么用呢?

我们在代码中分析:

public class MethodArgsTest {
  public static void main(String[] args) {
    MethodArgsTest test = new MethodArgsTest();
    test.show(12);
//    test.show("hello");
//    test.show("hello","world");
//    test.show();
    test.show(new String[]{"AA","BB","CC"});
  }
  public void show(int i){
  }
  public void show(String s){
    System.out.println("show(String)");
  }
  public void show(String ... strs){
    System.out.println("show(String ... strs)");
    for(int i = 0;i < strs.length;i++){
      System.out.println(strs[i]);
    }
  }
}

三、方法参数的值传递机制

若形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参

若形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

下面我们分别用两端代码来解释设两个机制:

//这里我们用交换两个数的程序来说明这一点
//首先是基本数据类型
public class ValueTransferTest1 {
  public static void main(String[] args) {
    int m = 10;
    int n = 20;
    System.out.println("m = " + m + ", n = " + n);
    //交换两个变量的值的操作
//    int temp = m ;
//    m = n;
//    n = temp;
    ValueTransferTest1 test = new ValueTransferTest1();
    test.swap(m, n);
    System.out.println("m = " + m + ", n = " + n);
  }
  public void swap(int m,int n){
    int temp = m ;
    m = n;
    n = temp;
  }
}

下面是引用数据类型

public class ValueTransferTest2 {
  public static void main(String[] args) {
    Data data = new Data();
    data.m = 10;
    data.n = 20;
    System.out.println("m = " + data.m + ", n = " + data.n);
    //交换m和n的值
//    int temp = data.m;
//    data.m = data.n;
//    data.n = temp;
    ValueTransferTest2 test = new ValueTransferTest2();
    test.swap(data);
    System.out.println("m = " + data.m + ", n = " + data.n);
  }
  public void swap(Data data){
    int temp = data.m;
    data.m = data.n;
    data.n = temp;
  }
}
class Data{
  int m;
  int n;
}

大家可以好好体会一下这两段代码,这些应该可以帮助理解数据类型的值传递机制!

相关文章
|
21天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
27天前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
66 9
|
19天前
|
安全 Java 开发者
Java中WAIT和NOTIFY方法必须在同步块中调用的原因
在Java多线程编程中,`wait()`和`notify()`方法是实现线程间协作的关键。这两个方法必须在同步块或同步方法中调用,这一要求背后有着深刻的原因。本文将深入探讨为什么`wait()`和`notify()`方法必须在同步块中调用,以及这一机制如何确保线程安全和避免死锁。
32 4
|
19天前
|
Java
深入探讨Java中的中断机制:INTERRUPTED和ISINTERRUPTED方法详解
在Java多线程编程中,中断机制是协调线程行为的重要手段。了解和正确使用中断机制对于编写高效、可靠的并发程序至关重要。本文将深入探讨Java中的`Thread.interrupted()`和`Thread.isInterrupted()`方法的区别及其应用场景。
22 4
|
17天前
|
Java 数据处理 数据安全/隐私保护
Java处理数据接口方法
Java处理数据接口方法
23 1
|
20天前
|
Java
实现java执行kettle并传参数
实现java执行kettle并传参数
24 1
|
2月前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
50 17
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
105 4
|
1月前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
122 2
|
27天前
|
Java
在Java中定义一个不做事且没有参数的构造方法的作用
Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。