java基礎之方法和方法的重載詳解

一、帶參方法

1.1 帶參方法的定義和調用

之前定義的方法大部分都是無參方法,但是有些方法的執行是需要前提條件的,那麼參數就是將這些前提條件傳送過來
定義帶參數的方法:

<訪問修飾符> 返回值類型 <方法名稱> (<形式參數列表>){
//方法的主體
}

調用帶參數的方法

對象名.方法名(參數1,參數2,參數3…參數n);

定義榨汁機的類,輸出詳細信息

package Kind.dh;

//定義榨汁機類
public class MethodWithParameters {
    //屬性:顏色 價格
    public String color;
    public double price;

    public void showInfo() {
        System.out.println("這是一臺" + color + "的榨汁機,價格為:" + price + "元");
    }

    //方法:榨汁-前提:水果 杯數-形式參數(形參):參數類型 參數名稱
    public void zhazhi(String fruit, int num) {
        System.out.println(num + "杯" + fruit + "汁");
    }
}
package instance.dh;

import Kind.dh.MethodWithParameters;

import java.util.Scanner;

public class MethodWithParametersTest {
    public static void main(String[] args) {
        //創建對象
        MethodWithParameters methodWithParameters = new MethodWithParameters();
        Scanner input = new Scanner(System.in);
        System.out.println("請輸入您的榨汁機的顏色:");
        methodWithParameters.color = input.next();
        System.out.println("請輸入您的榨汁機的價格:");
        methodWithParameters.price = input.nextDouble();
        methodWithParameters.showInfo();
        System.out.println("您想要榨什麼果汁:");
        String shuiguo = input.next();
        System.out.println("您需要榨幾杯果汁:");
        int num = input.nextInt();
        //這裡是實際參數(實參)
        methodWithParameters.zhazhi(shuiguo, num);
    }
}

1.2 帶參方法使用註意事項

方法定義處的參數叫形式參數,方法調用處傳的值為實際參數
帶參方法,參數個數可以有一個,也可以有多個,多個參數之間用逗號進行隔開
帶參方法,參數的名字可以隨意的取,符合變量命名規則
形參和實參的名字可以不一樣,但是數據類型一定要一致,順序要一樣,個數要一樣
方法有沒有參數和方法有沒有返回值沒有聯系

1.3 帶參方法的應用

package Kind.dh;

//定義一個存放學生姓名的數組,實現添加、查找 、和顯示本班的學生的信息的方法
//學員信息管理系統
public class Student02 {
    //屬性:存放學生姓名的數組
    //聲明學生姓名的數組
    String[] names = new String[30];

    //1.添加學生的姓名
    public void addName(String name) {
        //遍歷學生姓名的數組,查詢到數組中某一個元素為null則進行插入
        for (int i = 0; i < names.length; i++) {
            if (names[i] == null) {
                names[i] = name;
                break;//插入學生的姓名後退出循環
            }
        }
    }

    //2.在固定的區間內,查找某一個學生
    //start:其實查找的位置
    //end:結束查找的位置
    //name:查找的學生姓名
    public boolean searchName(int start, int end, String name) {
        boolean flag = true;//是否找到瞭該名學生,false沒找到,反之找到瞭
        for (int i = start - 1; i < end; i++) {
            if (name.equals(names[i])) {
                flag = true;
                break;
            }
        }
        return flag;
    }

    //顯示本班的學生信息
    public void showNames() {
        System.out.println("本班的學員列表:");
        for (int i = 0; i < names.length; i++) {
            if (names[i] != null) {
                System.out.println(names[i] + "\t");
                break;
            }
        }
    }
}
package instance.dh;

import Kind.dh.Student02;

import java.util.Scanner;

public class Student02Test {
    public static void main(String[] args) {
        Student02 student02 = new Student02();
        Scanner input = new Scanner(System.in);
        for (int i = 0; i < 5; i++) {
            System.out.println("請輸入第" + (i + 1) + "個同學的姓名:");
            String name = input.next();
            student02.addName(name);
        }
        student02.showNames();
        //查找某一個學生的信息
        System.out.println("請輸入要開始查找的位置:");
        int start = input.nextInt();
        System.out.println("請輸入要結束查找的位置:");
        int end = input.nextInt();
        System.out.println("請輸入您要查找的學生的姓名:");
        String findName = input.next();
        boolean flag = student02.searchName(start, end, findName);
        if (flag) {
            System.out.println("恭喜您已經查詢到瞭學生的信息");
        } else {
            System.out.println("抱歉,沒有查詢到學生的相關信息");
        }
    }
}

1.4 基本數據類型和引用數據類型傳參時的區別

定義學生類,並實現增1操作

package Kind.dh;
//學生類
public class Student {
    //屬性:姓名 年齡 愛好
    public String name;
    public int age;
    public String love;

    //方法:輸出個人信息
    public void showInfo() {
        System.out.println("我叫" + name + "現在" + age + "歲瞭" + "我的興趣愛好是" + love);
    }
}
package Kind.dh;

public class Demo {
    public void calc1(int num) {
        num = num + 1;
    }

    public void calc2(Student student) {
        student.age = student.age + 1;
    }
}
package instance.dh;

import Kind.dh.Student;
import Kind.dh.Demo;

public class DemoTest {
    public static void main(String[] args) {
        Demo test = new Demo();
        int n = 8;
        test.calc1(n);
        Student student = new Student();
        student.age = 18;
        test.calc2(student);
        System.out.println(n + "---" + student.age);
    }
}

運行代碼發現結果是8---19,但是我們想得到的是每一個結果自增1,應該是9---19才對,這是為什麼呢?這是由於參數類型的不同,如果是基本數據類型(int char double boolean float),操作傳遞的是變量的值,改變一個變量的值不會影像另一個變量的值。但是參數如果是引用數據類型(自定義數據類型 數組 接口),賦值時是將原對象的引用(也就是內存地址)傳遞給另一個引用。

基本數據類型傳參:

在這裡插入圖片描述

引用數據類型傳參:

在這裡插入圖片描述

1.5 方法傳參-對象數組

定義學生類並賦值輸出學生的成績,定義一個修改學生的成績的類,如果學生的的成績小於60分則進行加2

package Kind.dh;
//學生類
public class Student {
    //屬性:姓名 年齡 愛好
    public String name;
    public int age;
    public String love;
    public int score;
    //方法:輸出個人信息
    public void showInfo() {
//        System.out.println("我叫" + name + "現在" + age + "歲瞭" + "我的興趣愛好是" + love);
        System.out.println(name+"的成績是:"+ score);
    }
}
package Kind.dh;

//操作學生的成績
public class ModifyScore {
    //修改小於60分的學生成績
    public void modifyStuScore(Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            if (stus[i].score < 60) {
                stus[i].score += 2;
            }
        }
    }

    //顯示本組學生成績信息
    public void showStu(Student[] stus) {
        for (Student stu : stus) {
            stu.showInfo();
        }
    }
}
package instance.dh;

import Kind.dh.ModifyScore;
import Kind.dh.Student;

public class ModifyScoreTest {
    public static void main(String[] args) {
        ModifyScore modifyScore = new ModifyScore();
        //定義一個學生對象的數組
        Student student1 = new Student();
        student1.name = "張三";
        student1.score = 43;
        Student student2 = new Student();
        student2.name = "李四";
        student2.score = 59;
        Student student3 = new Student();
        student3.name = "王五";
        student3.score = 90;
        Student[] students = new Student[3];
        students[0] = student1;
        students[1] = student2;
        students[2] = student3;
        //顯示學生的信息、修改學生的成績
        System.out.println("成績修改前:");
        modifyScore.showStu(students);
        modifyScore.modifyStuScore(students);
        System.out.println("成績修改後:");
        modifyScore.showStu(students);
    }
}

二、構造方法

new一個對象的時候要用到構造函數,例如Student student1 = new Student();這時調用的是Hello的無參數構造方法
構造方法是用來完成對象的初始化的,但是通常在代碼中不需要手動書寫,這是因為系統提供瞭默認的無參的構造方法。由於構造方法也屬於方法的范疇,可見構造方法也可以指定參數。

構造方法的格式如下:

訪問修飾符 構造方法名 (){
//初始化代碼
}

需要我們值得註意的是構造方法沒有返回值類型,並且方法名和類名是相同的。有返回值類型的方法是常用的普通方法

package Kind.dh;

//學生類
public class Student {
    //屬性:姓名 年齡 愛好
    public String name;
    public int age;
    public String love;
    public int score;

    //系統會自動生成一個無參構造方法
    /*
     public Student(){
        //對象初始化代碼
    }
    */
    //可以在構造方法中添加參數
    /*
    public Student(String name,int score){
        name = name;
        score = score;
    }
    */
    //可以理解為這段代碼
    /*
     public Student(String n,int s){
        name = n;
        score = s;
    }
    */
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    //方法:輸出個人信息
    public void showInfo() {
//        System.out.println("我叫" + name + "現在" + age + "歲瞭" + "我的興趣愛好是" + love);
        System.out.println(name + "的成績是:" + score);
    }
}
package Kind.dh;

//操作學生的成績
public class ModifyScore {
    //修改小於60分的學生成績
    public void modifyStuScore(Student[] stus) {
        for (int i = 0; i < stus.length; i++) {
            if (stus[i].score < 60) {
                stus[i].score += 2;
            }
        }
    }

    //顯示本組學生成績信息
    public void showStu(Student[] stus) {
        for (Student stu : stus) {
            stu.showInfo();
        }
    }
}
package instance.dh;

import Kind.dh.ModifyScore;
import Kind.dh.Student;

public class ModifyScoreTest {
    public static void main(String[] args) {
        ModifyScore modifyScore = new ModifyScore();
        //定義一個學生對象的數組
        //在這裡就實現瞭對象的初始化和賦值
        Student student1 = new Student("張三", 43);
//        student1.name = "張三";
//        student1.score = 43;
        Student student2 = new Student("李四", 59);
//        student2.name = "李四";
//        student2.score = 59;
        Student student3 = new Student("王五", 90);
//        student3.name = "王五";
//        student3.score = 90;
        Student[] students = new Student[3];
        students[0] = student1;
        students[1] = student2;
        students[2] = student3;
        //顯示學生的信息、修改學生的成績
        System.out.println("成績修改前:");
        modifyScore.showStu(students);
        modifyScore.modifyStuScore(students);
        System.out.println("成績修改後:");
        modifyScore.showStu(students);
    }
}

代碼中有這樣的一段:

public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

這裡的this關鍵字是代指當前對象

Student student1 = new Student("張三", 43);
Student student2 = new Student("李四", 59);
Student student3 = new Student("王五", 90);

所謂的當前對象指的是Student類經過實例化出的student1,student2,student3。程序執行創建瞭student1時,this代指的是student1;創建瞭student2時,this代指的是student2這個對象。
如果代碼中自定義瞭帶參的構造方法後,系統不會再提供無參構造方法瞭

2.1 this的其他用法

this可以調用類中的普通方法和構造方法

package Kind.dh;

//學生類
public class Student {
    //屬性:姓名 年齡 愛好
    public String name;
    public int age;
    public String love;
    public int score;

    //系統會自動生成一個無參構造方法
    /*
     public Student(){
        //對象初始化代碼
    }
    */
    //可以在構造方法中添加參數
    /*
    public Student(String name,int score){
        name = name;
        score = score;
    }
    */
    //可以理解為這段代碼
    /*
     public Student(String n,int s){
        name = n;
        score = s;
    }
    */
    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    //方法:輸出個人信息
    public void showInfo() {
//        System.out.println("我叫" + name + "現在" + age + "歲瞭" + "我的興趣愛好是" + love);
        System.out.println(name + "的成績是:" + score);
    }
    public void method1(){
//      showInfo();
        //this可以調用普通方法
        this.showInfo();
    }
    public Student(String name,int score,int age){
        /*
        this.name = name;
        this.score = score;
        this.age = age;
        */
        //上述代碼等同於
        this(name, score);
        this.age= age;
        //需要註意的是this調用構造方法時一定要寫在第一句中。
    }
}

三、方法重載

方法分為瞭普通方法和構造方法,所以方法重載也相應的分為瞭普通方法重載和構造方法重載

  • 構造方法重載:

方法名相同
參數項不同
和返回值、訪問修飾符無關

  • 普通方法重載

需要在同一個類中
方法名相同
參數個數或者是類型不同
和返回值、訪問修飾符無關

  • 實現簡易計算器,分別實現兩個整數、兩個浮點數、三個浮點數進行相加的操作
package Kind.dh;

//實現簡易計算器
public class Calc {
    //實現兩個整數相加操作
    public void add(int num1, int num2) {
        int sum = num1 + num2;
        System.out.println(num1 + " + " + num2 + " = " + sum);
    }

    //實現兩個浮點數進行相加
    public void add(double num1, double num2) {
        double sum = num1 + num2;
        System.out.println(num1 + " + " + num2 + " = " + sum);
    }

    //實現三個浮點數進行相加操作
    public void add(double num1, double num2, double num3) {
        double sum = num1 + num2 + num3;
        System.out.println(num1 + " + " + num2 + " + " + num3 + " = " + sum);
    }
}
package instance.dh;

import Kind.dh.Calc;

public class CalcTest {
    public static void main(String[] args) {
        Calc calc = new Calc();
        calc.add(2, 8);
        calc.add(2.3, 78.9);
        calc.add(23.4, 67.8, 90.8);
    }
}

其實System.out.println();就是一個方法重載。

在這裡插入圖片描述

3.1 成員變量和局部變量

變量聲明的位置決定變量的作用域,變量的作用域確定可以在程序中按照變量名稱訪問該變量的區域。
成員變量和局部變量的區別:

  • 作用域不同

局部變量的作用在它的方法中
成員變量(全局變量)作用在整個類中

  • 初始值不同

java會給成員變量一個初始值
java不會給局部變量賦初始值

  • 註意:

在同一個方法中,不允許有同名稱的局部變量
在不同的方法中,可以有同名稱的局部變量
在同一個類中,成員變量和局部變量同名稱時,局部變量具有更高的優先級

package cn.zhz.Test.dh;

public class Var {
    //屬性:這裡的是成員變量 全局變量
    //定義成員變量num和s
    //系統默認給成員變量進行賦初始值,如果是int就是0,String就是null,double就是0.0
    int num;
    String s;
    //在同一個類中,局部變量可以和全局變量同名稱,但是同名的時候局部變量的優先級會更高一些
    int var = 9;

    //方法:這裡的是成員方法
    public void m1() {
        //這裡的a的作用域在m1中
        int a = 1;
        for (; a <= 5; a++) {
            System.out.println("hello");
        }
    }

    public void m2() {
        //這裡的a的作用域在for循環中
        for (int b = 1; b <= 5; b++) {
            System.out.println(b);
        }
    }

    public void m3() {
        System.out.println(num);
        System.out.println(s);
    }

    //參數也是一種變量,它做的是局部變量
    public void m4(int num) {
        System.out.println("num = " + num);
    }

    public static void main(String[] args) {
//        //可以通過擴大a的變量范圍來解決,此時a的作用域在main方法中
//        int a = 0;
//        for(;a <= 4;a ++){
//            System.out.println("hello");
//        }
//        System.out.println(a);//系統會找不到變量a
    }
}

到此這篇關於java基礎之方法和方法的重載詳解的文章就介紹到這瞭,更多相關java方法和方法的重載內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: