方法的定义、调用和重载

一、什么是方法呢?

在前面学习中我们经常使用到 System.out.println(),那么它是什么含义呢?

  • println() 是一个方法。
  • System 是系统类。
  • out 是标准输出对象。

这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 println()。

方法(method)是一段用来完成特定功能的代码片段,类似于其它语言的函数(function)。
方法用于定义该类或该类的实例的行为特征和功能实现。 方法是类和对象行为特征的抽象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。

二、方法的优点

方法具有一下有点:

  1. 使程序变得更简短而清晰。
  2. 有利于程序维护。
  3. 可以提高程序开发的效率。
  4. 提高了代码的重用性。

三、方法的定义

定义一个方法包含以下语法:

修饰符 返回值类型 方法名(参数类型 参数名){
    ...
    方法体
    ...
    return 返回值;
}

方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

  • 修饰符:修饰符,可选的,通知编译器如何调用该方法。定义了该方法的访问类型。
  • 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void
  • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
  • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
  • 方法体:方法体包含具体的语句,定义该方法的功能。

案例代码如下:

package com.cycle;

/**
 * @author : Augus
 * @date: 2023/5/16 14:38
 * @Description: com.cycle
 * @version: 1.0
 */
public class Demo06 {
    public static void main(String[] args) {
        //嵌套循环:在循环里面还有循环
        String[] names = {"马宝国", "闫芳", "雷雷", "蔡徐坤"};

        String[] skills = {"接化发", "电母耍猴", "喜欢哭", "鸡你太美"};

        //外层循环
        for (String name : names) {
            //内存循环
            for (String skill : skills) {
                System.out.println(name+"具有技能:"+skill);
            }
        }
    }
    //比较两个数的大小
    public static int max(int a,int b){
        int result = 0;

        if(a>b){
            result = a;
        }else {
            result = b;
        }
        return result;
    }

    //上面方法的简写
    public static int max1(int a,int b){
        return a>b?a:b;
    }

}

四、方法调用

Java 支持两种调用方法的方式,根据方法是否存在返回值来选择。

当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。

当方法返回一个值的时候,需要指定一个变量去接受返回值。例如:

int number1 = max(12, 67);

如果方法没有返回值是使用void定义,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:

System.out.println(number1);

案例代码:

package com.cycle;

public class Demo06 {
    public static void main(String[] args) {
        int number1 = max(12, 67);
        System.out.println(number1);
    }

    public static int max(int a,int b){
        int result = 0;

        if(a>b){
            result = a;
        }else {
            result = b;
        }
        return result;
    }

    //上面方法的简写
    public static int max1(int a,int b){
        return a>b?a:b;
    }

}

这个类中包含 main 方法和 max 方法。main 方法是被 JVM 调用的,除此之外,main 方法和其它方法没什么区别。

main 方法的头部是不变的,如例子所示,带修饰符 public 和 static,返回 void 类型值,方法名字是 main,此外带个一个 String[] 类型参数。String[] 表明参数是字符串数组。

六、void 关键字

声明和调用一个 void 方法。

下面的例子声明了一个名为 outPutLevel 的方法,然后调用输出等级:

package com.method;


public class Demo01 {
    public static void main(String[] args) {
        //没有返回值直接调用即可
        outPutLevel(64.0);
    }

    public static void outPutLevel(double score){
        if(score>=90.0){
            System.out.println("A");
        }else if(score>=80.0){
            System.out.println("B");
        }else if(score>=70.0){
            System.out.println("C");
        }else if(score>=60){
            System.out.println("D");
        }else {
            System.out.println("F");
        }
    }
}

调用一个方法时候需要提供参数,必须按照参数列表指定的顺序传入参数。

package com.method;

/**
 * @author : Augus
 * @date: 2023/5/17 14:45
 * @Description: com.method
 * @version: 1.0
 */
public class Demo02 {
    public static void main(String[] args) {
        int num1 = 2;
        int num2 = 5;
        String mess = "日常练习:";
        //参数要按照顺序依次传入
        swap(num1,num2,mess);
    }

    //交换两个变量
    public static void swap(int n1, int n2, String message){
        System.out.println(message);
        System.out.println("交换前n1的值为:"+n1+",交换前n2的值:"+n2);

        //交换值
        int tmp = n1;//保留n1的值

        n1 = n2; //将n1赋值为n2

        n2 = tmp; //将tmp赋值给n2

        System.out.println("交换后n1的值为:"+n1+",交换后n2的值:"+n2);
    }
}

七、方法的重载

7.1.什么是方法的重载?

方法的重载是指一个类中可以定义多个方法名相同,但参数不同的方法。 调用时,会根据不同的参数自动匹配对应的方法。

注意本质:重载的方法,实际是完全不同的方法,只是名称相同而已!

7.2.构成方法重载的条件有哪些?

  • 上面的不同的含义:形参类型、形参个数、形参顺序不同
  • 只有返回值不同不构成方法的重载,如:int a(String str){}与 void a(String str){}不构成方法重载
  • 只有形参的名称不同,不构成方法的重载 如:int a(String str){}与int a(String s){}不构成方法重载

7.3.案例演示

代码如下:

package com.method;

/**
 * @author : Augus
 * @date: 2023/5/17 15:20
 * @Description: com.method
 * @version: 1.0
 */
public class Demo03 {
    public static void main(String[] args) {
        //10+20
        int i = addNumber(10, 20);
        System.out.println(i);

        //10+20+30
        int i1 = addNumber(10, 20, 30);
        System.out.println(i1);

        //10.5+11.5
        double v = addNumber(10.5, 11.5);
        System.out.println(v);

    }

    //定义方法:两个数相加
    public static int addNumber(int num1, int num2){
        return num1+num2;
    }

    //定义方法:三个数相加
    public static int addNumber(int num1, int num2, int num3){
        return num1+num2+num3;
    }

    //定义方法:两个double类型的数相加
    public static double addNumber(double num1, double num2){
        return num1+num2;
    }
}

注意:
1.方法的重载:在同一个类中,方法名相同,形参列表不同的多个方法,构成了方法的重载。
2.方法的重载只跟方法名和形参列表有关,与修饰符,返回值类型无关。
3.注意:形参列表不同指的是什么?
(1)个数不同:add() add(int num1) add(int num1,int num2)

(2)顺序不同:add(int num1,double num2) add(double num1,int num2)

(3)类型不同:add(int num1)  add(double num1)

八、可变参数

JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。方法的可变参数的声明如下所示:

typeName... parameterName

在方法声明中,在指定参数类型后加一个省略号。一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。案例如下:

package com.method;

/**
 * @author : Augus
 * @date: 2023/5/17 16:32
 * @Description: com.method
 * @version: 1.0
 */
public class Demo05 {
    public static void main(String[] args) {
        //调用方法
        printNumber(23,2,56,121,67,12);
    }

    public static void printNumber(int... numbers){
        //可变参数输入多个值会构成数组,如果数组长度为0,表示没有传入值
        if(numbers.length==0){
            System.out.println("没有传入值");
        }

        //如果存在值,则输出
        for (int number : numbers) {
            System.out.println(number);
        }
    }

}

九、构造方法

9.1.什么是构造方法?

当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。

通常会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。

不管你是否自定义构造方法,所有的类都有构造方法,因为 Java 自动提供了一个默认构造方法,默认构造方法的访问修饰符和类的访问修饰符相同(类为 public,构造函数也为 public;类改为 protected,构造函数也改为 protected)。

一旦你定义了自己的构造方法,默认构造方法就会失效。

9.2.案例

定义Person类,给定位构造方法:构造方法的名称就是类名。构造方法的参数没有限制,在方法内部,也可以编写任意语句。但是,和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。

package com.method;

/**
 * @author : Augus
 * @date: 2023/5/17 15:47
 * @Description: com.method
 * @version: 1.0
 */
public class Person {
    //实例变量
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

调用上面的构造方法:

package com.method;

public class Demo04 {
    public static void main(String[] args) {
        Person person = new Person("李明", 23);
        System.out.println(person.getName());
        System.out.println(person.getAge());
    }
}

9.3.默认构造方法

任何class都有构造方法,如果一个类没有定义构造方法,编译器会自动为我们生成一个默认构造方法,它没有参数,也没有执行语句,类似这样:

class Person {
    public Person() {
    }
}

要注意的是,如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法,我们上面的案例中创建了一个带两个参数的构造器,后期new这个类的时候就必须带参数,否则会报错,

如果既要能使用带参数的构造方法,又想保留不带参数的构造方法,那么只能把两个构造方法都定义出来,在单独去定义一个无参构造方法即可,如下图:

没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false:

package com.method;

public class Person {
    //实例变量
    private String name;// 默认初始化为null
    private int age;// 默认初始化为0

    public Person(){

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
posted @ 2023-05-17 15:41  酒剑仙*  阅读(75)  评论(0)    收藏  举报