- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- java基礎之方法和方法的重載詳解
之前定義的方法大部分都是無(wú)參方法,但是有些方法的執行是需要前提條件的,那么參數就是將這些前提條件傳送過(guò)來(lái)
定義帶參數的方法:
<訪(fǎng)問(wèn)修飾符> 返回值類(lèi)型 <方法名稱(chēng)> (<形式參數列表>){
//方法的主體
}
調用帶參數的方法
對象名.方法名(參數1,參數2,參數3…參數n);
定義榨汁機的類(lèi),輸出詳細信息
package Kind.dh; //定義榨汁機類(lèi) public class MethodWithParameters { //屬性:顏色 價(jià)格 public String color; public double price; public void showInfo() { System.out.println("這是一臺" + color + "的榨汁機,價(jià)格為:" + price + "元"); } //方法:榨汁-前提:水果 杯數-形式參數(形參):參數類(lèi)型 參數名稱(chēng) 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) { //創(chuàng )建對象 MethodWithParameters methodWithParameters = new MethodWithParameters(); Scanner input = new Scanner(System.in); System.out.println("請輸入您的榨汁機的顏色:"); methodWithParameters.color = input.next(); System.out.println("請輸入您的榨汁機的價(jià)格:"); methodWithParameters.price = input.nextDouble(); methodWithParameters.showInfo(); System.out.println("您想要榨什么果汁:"); String shuiguo = input.next(); System.out.println("您需要榨幾杯果汁:"); int num = input.nextInt(); //這里是實(shí)際參數(實(shí)參) methodWithParameters.zhazhi(shuiguo, num); } }
方法定義處的參數叫形式參數,方法調用處傳的值為實(shí)際參數
帶參方法,參數個(gè)數可以有一個(gè),也可以有多個(gè),多個(gè)參數之間用逗號進(jìn)行隔開(kāi)
帶參方法,參數的名字可以隨意的取,符合變量命名規則
形參和實(shí)參的名字可以不一樣,但是數據類(lèi)型一定要一致,順序要一樣,個(gè)數要一樣
方法有沒(méi)有參數和方法有沒(méi)有返回值沒(méi)有聯(lián)系
package Kind.dh; //定義一個(gè)存放學(xué)生姓名的數組,實(shí)現添加、查找 、和顯示本班的學(xué)生的信息的方法 //學(xué)員信息管理系統 public class Student02 { //屬性:存放學(xué)生姓名的數組 //聲明學(xué)生姓名的數組 String[] names = new String[30]; //1.添加學(xué)生的姓名 public void addName(String name) { //遍歷學(xué)生姓名的數組,查詢(xún)到數組中某一個(gè)元素為null則進(jìn)行插入 for (int i = 0; i < names.length; i++) { if (names[i] == null) { names[i] = name; break;//插入學(xué)生的姓名后退出循環(huán) } } } //2.在固定的區間內,查找某一個(gè)學(xué)生 //start:其實(shí)查找的位置 //end:結束查找的位置 //name:查找的學(xué)生姓名 public boolean searchName(int start, int end, String name) { boolean flag = true;//是否找到了該名學(xué)生,false沒(méi)找到,反之找到了 for (int i = start - 1; i < end; i++) { if (name.equals(names[i])) { flag = true; break; } } return flag; } //顯示本班的學(xué)生信息 public void showNames() { System.out.println("本班的學(xué)員列表:"); 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) + "個(gè)同學(xué)的姓名:"); String name = input.next(); student02.addName(name); } student02.showNames(); //查找某一個(gè)學(xué)生的信息 System.out.println("請輸入要開(kāi)始查找的位置:"); int start = input.nextInt(); System.out.println("請輸入要結束查找的位置:"); int end = input.nextInt(); System.out.println("請輸入您要查找的學(xué)生的姓名:"); String findName = input.next(); boolean flag = student02.searchName(start, end, findName); if (flag) { System.out.println("恭喜您已經(jīng)查詢(xún)到了學(xué)生的信息"); } else { System.out.println("抱歉,沒(méi)有查詢(xún)到學(xué)生的相關(guān)信息"); } } }
定義學(xué)生類(lèi),并實(shí)現增1操作
package Kind.dh; //學(xué)生類(lèi) public class Student { //屬性:姓名 年齡 愛(ài)好 public String name; public int age; public String love; //方法:輸出個(gè)人信息 public void showInfo() { System.out.println("我叫" + name + "現在" + age + "歲了" + "我的興趣愛(ài)好是" + 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); } }
運行代碼發(fā)現結果是8---19
,但是我們想得到的是每一個(gè)結果自增1,應該是9---19
才對,這是為什么呢?這是由于參數類(lèi)型的不同,如果是基本數據類(lèi)型(int char double boolean float),操作傳遞的是變量的值,改變一個(gè)變量的值不會(huì )影像另一個(gè)變量的值。但是參數如果是引用數據類(lèi)型(自定義數據類(lèi)型 數組 接口),賦值時(shí)是將原對象的引用(也就是內存地址)傳遞給另一個(gè)引用。
基本數據類(lèi)型傳參:
引用數據類(lèi)型傳參:
定義學(xué)生類(lèi)并賦值輸出學(xué)生的成績(jì),定義一個(gè)修改學(xué)生的成績(jì)的類(lèi),如果學(xué)生的的成績(jì)小于60分則進(jìn)行加2
package Kind.dh; //學(xué)生類(lèi) public class Student { //屬性:姓名 年齡 愛(ài)好 public String name; public int age; public String love; public int score; //方法:輸出個(gè)人信息 public void showInfo() { // System.out.println("我叫" + name + "現在" + age + "歲了" + "我的興趣愛(ài)好是" + love); System.out.println(name+"的成績(jì)是:"+ score); } }
package Kind.dh; //操作學(xué)生的成績(jì) public class ModifyScore { //修改小于60分的學(xué)生成績(jì) public void modifyStuScore(Student[] stus) { for (int i = 0; i < stus.length; i++) { if (stus[i].score < 60) { stus[i].score += 2; } } } //顯示本組學(xué)生成績(jì)信息 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(); //定義一個(gè)學(xué)生對象的數組 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; //顯示學(xué)生的信息、修改學(xué)生的成績(jì) System.out.println("成績(jì)修改前:"); modifyScore.showStu(students); modifyScore.modifyStuScore(students); System.out.println("成績(jì)修改后:"); modifyScore.showStu(students); } }
new一個(gè)對象的時(shí)候要用到構造函數,例如Student student1 = new Student();這時(shí)調用的是Hello的無(wú)參數構造方法
構造方法是用來(lái)完成對象的初始化的,但是通常在代碼中不需要手動(dòng)書(shū)寫(xiě),這是因為系統提供了默認的無(wú)參的構造方法。由于構造方法也屬于方法的范疇,可見(jiàn)構造方法也可以指定參數。
構造方法的格式如下:
訪(fǎng)問(wèn)修飾符 構造方法名 (){
//初始化代碼
}
需要我們值得注意的是構造方法沒(méi)有返回值類(lèi)型,并且方法名和類(lèi)名是相同的。有返回值類(lèi)型的方法是常用的普通方法
package Kind.dh; //學(xué)生類(lèi) public class Student { //屬性:姓名 年齡 愛(ài)好 public String name; public int age; public String love; public int score; //系統會(huì )自動(dòng)生成一個(gè)無(wú)參構造方法 /* 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; } //方法:輸出個(gè)人信息 public void showInfo() { // System.out.println("我叫" + name + "現在" + age + "歲了" + "我的興趣愛(ài)好是" + love); System.out.println(name + "的成績(jì)是:" + score); } }
package Kind.dh; //操作學(xué)生的成績(jì) public class ModifyScore { //修改小于60分的學(xué)生成績(jì) public void modifyStuScore(Student[] stus) { for (int i = 0; i < stus.length; i++) { if (stus[i].score < 60) { stus[i].score += 2; } } } //顯示本組學(xué)生成績(jì)信息 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(); //定義一個(gè)學(xué)生對象的數組 //在這里就實(shí)現了對象的初始化和賦值 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; //顯示學(xué)生的信息、修改學(xué)生的成績(jì) System.out.println("成績(jì)修改前:"); modifyScore.showStu(students); modifyScore.modifyStuScore(students); System.out.println("成績(jì)修改后:"); modifyScore.showStu(students); } }
代碼中有這樣的一段:
public Student(String name, int score) { this.name = name; this.score = score; }
這里的this關(guān)鍵字是代指當前對象
Student student1 = new Student("張三", 43); Student student2 = new Student("李四", 59); Student student3 = new Student("王五", 90);
所謂的當前對象指的是Student類(lèi)經(jīng)過(guò)實(shí)例化出的student1,student2,student3。程序執行創(chuàng )建了student1時(shí),this代指的是student1;創(chuàng )建了student2時(shí),this代指的是student2這個(gè)對象。
如果代碼中自定義了帶參的構造方法后,系統不會(huì )再提供無(wú)參構造方法了
this可以調用類(lèi)中的普通方法和構造方法
package Kind.dh; //學(xué)生類(lèi) public class Student { //屬性:姓名 年齡 愛(ài)好 public String name; public int age; public String love; public int score; //系統會(huì )自動(dòng)生成一個(gè)無(wú)參構造方法 /* 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; } //方法:輸出個(gè)人信息 public void showInfo() { // System.out.println("我叫" + name + "現在" + age + "歲了" + "我的興趣愛(ài)好是" + love); System.out.println(name + "的成績(jì)是:" + 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調用構造方法時(shí)一定要寫(xiě)在第一句中。 } }
方法分為了普通方法和構造方法,所以方法重載也相應的分為了普通方法重載和構造方法重載
方法名相同
參數項不同
和返回值、訪(fǎng)問(wèn)修飾符無(wú)關(guān)
需要在同一個(gè)類(lèi)中
方法名相同
參數個(gè)數或者是類(lèi)型不同
和返回值、訪(fǎng)問(wèn)修飾符無(wú)關(guān)
package Kind.dh; //實(shí)現簡(jiǎn)易計算器 public class Calc { //實(shí)現兩個(gè)整數相加操作 public void add(int num1, int num2) { int sum = num1 + num2; System.out.println(num1 + " + " + num2 + " = " + sum); } //實(shí)現兩個(gè)浮點(diǎn)數進(jìn)行相加 public void add(double num1, double num2) { double sum = num1 + num2; System.out.println(num1 + " + " + num2 + " = " + sum); } //實(shí)現三個(gè)浮點(diǎn)數進(jìn)行相加操作 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); } }
其實(shí)System.out.println();
就是一個(gè)方法重載。
變量聲明的位置決定變量的作用域,變量的作用域確定可以在程序中按照變量名稱(chēng)訪(fǎng)問(wèn)該變量的區域。
成員變量和局部變量的區別:
局部變量的作用在它的方法中
成員變量(全局變量)作用在整個(gè)類(lèi)中
java會(huì )給成員變量一個(gè)初始值
java不會(huì )給局部變量賦初始值
在同一個(gè)方法中,不允許有同名稱(chēng)的局部變量
在不同的方法中,可以有同名稱(chēng)的局部變量
在同一個(gè)類(lèi)中,成員變量和局部變量同名稱(chēng)時(shí),局部變量具有更高的優(yōu)先級
package cn.zhz.Test.dh; public class Var { //屬性:這里的是成員變量 全局變量 //定義成員變量num和s //系統默認給成員變量進(jìn)行賦初始值,如果是int就是0,String就是null,double就是0.0 int num; String s; //在同一個(gè)類(lèi)中,局部變量可以和全局變量同名稱(chēng),但是同名的時(shí)候局部變量的優(yōu)先級會(huì )更高一些 int var = 9; //方法:這里的是成員方法 public void m1() { //這里的a的作用域在m1中 int a = 1; for (; a <= 5; a++) { System.out.println("hello"); } } public void m2() { //這里的a的作用域在for循環(huán)中 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) { // //可以通過(guò)擴大a的變量范圍來(lái)解決,此時(shí)a的作用域在main方法中 // int a = 0; // for(;a <= 4;a ++){ // System.out.println("hello"); // } // System.out.println(a);//系統會(huì )找不到變量a } }
到此這篇關(guān)于java基礎之方法和方法的重載詳解的文章就介紹到這了,更多相關(guān)java方法和方法的重載內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站