java基础深入_java编程基础之方法深入
大綱
方法入門
概述
前講解的循環(huán)操作,可以解決的是代碼重復(fù)的問題,但是此時(shí)的重復(fù)的代碼必須是有規(guī)律的。那循環(huán)操作,能解決所有的代碼重復(fù)嗎?答案肯定是不行的,比如針對于某一種功能的重復(fù)操作,循環(huán)就無法實(shí)現(xiàn),我們可以使用方法.
編寫一個(gè)飛機(jī)大戰(zhàn)游戲,程序在運(yùn)行過程中,需要不斷地發(fā)射子彈。假設(shè)發(fā)射子彈功能需要編寫200行代碼,那么,每次發(fā)射子彈都需要重復(fù)地編寫這200行代碼,這樣的程序太low了。在開發(fā)中我們要遵循DRY原則(Don’t Repeat Youself)——不要重復(fù)你自己的代碼,因?yàn)橹貜?fù)意味著維護(hù)成本很大,如果要修改功能代碼,則每一個(gè)重復(fù)的地方都要修改一次,你敢確保每個(gè)重復(fù)的地方都能改到嗎?你不感到厭煩嗎?
為了解決功能代碼重復(fù)編寫的問題,可以把發(fā)射子彈的代碼提取出來專門放在一個(gè)代碼塊(一對{})中,并為這段代碼起個(gè)唯一的名字,如此,每次發(fā)射子彈的時(shí)候直接通過這個(gè)名字就可以調(diào)用發(fā)射子彈的功能代碼了。這個(gè)代碼塊我們稱之為方法。
方法就是 封裝在一起來執(zhí)行操作語句的集合,用來完成某個(gè)功能操作。?
優(yōu)點(diǎn)使程序變得更簡短而清晰。
有利于程序維護(hù)。
可以提高程序開發(fā)的效率。
提高了代碼的重用性。
定義與使用
聲明格式:[修飾符] 方法返回值類型 方法名(形參列表) {
方法體;
return 返回值;
}//有返回值類型的方法
public static int add(int a, int b, int c ){ //求和
int k = a + b + c;
return k;
}//沒有返回值的方法,沒有形參
public static void printStar(){ //打印5行5列的星星
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
System.out.print("* ");
}
System.out.println();
}
}訪問修飾符:方法允許被訪問的權(quán)限范圍;
返回值類型:如果方法不返回任何值,則指定為void;如果方法具有返回值,則需要指定返回值的類型,并且在方法體中使用 return語句返回值;
方法名:定義方法的名字,必須使用合法的標(biāo)識符,見名知意。
形參列表:參數(shù)可以有多個(gè),多個(gè)參數(shù)間以逗號隔開,每個(gè)參數(shù)由參數(shù)類型和參數(shù)名組成,以空格隔開。
調(diào)用:
方法定義完成后,若要使用,必須調(diào)用它。在調(diào)用時(shí),調(diào)用的控制權(quán)由方法調(diào)用處轉(zhuǎn)移到方法中,方法遇到 return 或者 }結(jié)束時(shí),將調(diào)用權(quán)交還給調(diào)用處。也就是”從哪里來到哪里去”的套路。方法名([實(shí)參列表])
注意:方法不調(diào)用不執(zhí)行
存在返回值,接收變量或匿名接收(輸出或者調(diào)用)
定義方法指定形參,調(diào)用方法指定實(shí)參
方法調(diào)用是要求形參實(shí)參要求個(gè)數(shù)相同,類型匹配
方法深入
void 關(guān)鍵字
一個(gè) void方法,它不返回任何值。public static void print() {
for(int i=1;i<=9;i++) {
for(int j=1;j<=i;j++) {
System.out.print(j+"*"+i+"="+i*j+"\t");
}
System.out.println();//換行
}
}
一個(gè)帶有返回值類型的方法,必須帶出返回值。public static int getSum(int a,int b){
return a+b;
}
return關(guān)鍵字
return 為 跳出方法 或 返回值。
注意:在一個(gè)作用域內(nèi) return 之后不能再存在代碼public static int getSum(int a,int b){
return a+b;
System.out.println("return后不能存在代碼!!!"); //不可達(dá)語句
}
return語句:return語句可以出現(xiàn)在任何(有返回值和沒有返回值)方法中
return語句 在沒有返回值的方法中,用來提前結(jié)束方法//打印出1~5之間前兩個(gè)數(shù)
public static void test(){
for(int i=1;i<=5;i++){
if(i==3){
return; //結(jié)束方法
}
System.out.println(i);
}
}
return語句 在有返回值的方法當(dāng)中,有兩個(gè)作用:提前結(jié)束方法,送出結(jié)果。//求出1~100之間前5個(gè)能被2整除數(shù)的和
public static int getSum(int a,int b){
int sum=0; //和
for(int i=1;i<=100;i++){
sum+=i;
if(i==5){
return sum; //1)提前結(jié)束方法 2) 帶出返回值
}
}
}
一個(gè)方法只能執(zhí)行一條return語句
在一定會被執(zhí)行的return語句后,寫的語句為不可達(dá)語句,程序自動檢測這種語句,永遠(yuǎn)不會被執(zhí)行到,報(bào)錯(cuò)。
在循環(huán)中無條件的break后寫語句,會出現(xiàn)不可達(dá)語句
在死循環(huán)(沒有break來結(jié)束的死循環(huán))后寫語句,會出現(xiàn)不可達(dá)語句
思考角度
? 編寫一個(gè)方法時(shí),請思考這四個(gè)方面:
1)、確定方法的功能
2)、確定方法的名稱
3)、此方法能否獨(dú)立運(yùn)行,不能獨(dú)立,需要外界數(shù)據(jù)參與運(yùn)算,確定形參。
4)、此方法完成后,其結(jié)果是否直接影響調(diào)用處的后續(xù)操作,如果影響,確定返回類型,不影響則為 void
簽名(signature)
方法的簽名,確保在一個(gè)類中的唯一性。方法的簽名只看 方法名和形參
( 類型 個(gè)數(shù) 和順序) ,與修飾符 返回類型 和形參名無關(guān)。public static void getSum(int x,int y){} -->getSum(int x,int y)為方法簽名
類型兼容
在調(diào)用方法時(shí),形參與實(shí)參,接收類型與返回類型和返回值類型應(yīng)該保持兼容。
①形參>=實(shí)參public static void main(String[] args) {
// int i=5;
byte i=5;
int x=test(i); //i實(shí)參
}
public static int test(int d){ //d形參
return 'a';
}
②接收類型>=返回值類型>=return類型public static void main(String[] args) {
int x=test(5); //x為接收返回值的變量類型
}
//int為方法的返回值類型(規(guī)定return后面數(shù)據(jù)的值只能<=int)
public static int test(int d){ //d形參
return 'a'; //return后面數(shù)據(jù)的類型
}
值傳遞和引用傳遞
值傳遞和引用傳遞:
所謂值傳遞,就是說僅將對象的值傳遞給目標(biāo)對象,就相當(dāng)于copy;系統(tǒng)將為目標(biāo)對象重新開辟一個(gè)完全相同的內(nèi)存空間。public static void main(String[] args) {
byte i=5;
test(i); //相當(dāng)于test(5) -->值傳遞
System.out.println(i); //5
}
public static void test(int i){
i++; //局部變量i++;
}
所謂引用,就是說將對象在內(nèi)存中的地址傳遞給目標(biāo)對象,就相當(dāng)于使目標(biāo)對象和原始對象對應(yīng)同一個(gè)內(nèi)存存儲空間。此時(shí),如果對目標(biāo)對象進(jìn)行修改,內(nèi)存中的數(shù)據(jù)也會改變。public static void main(String[] args) {
Person p = new Person("張三",18);
test(p); //i實(shí)參
System.out.println(p.age); //引用傳遞|p指向?qū)ο蟮牡刂分?/p>
}
public static void test(Person p){
p.age++;
}
內(nèi)存劃分:
JVM內(nèi)存劃分:
棧的特點(diǎn):
站描述的時(shí)方法執(zhí)行的內(nèi)存模型,每個(gè)方法被調(diào)用都 會創(chuàng)建一個(gè)棧幀()
在程序運(yùn)行期,方法的內(nèi)存分析:public class MethodTest {
public static void main(String[] args) {
int w=5;
int h=7;
int area=getArea(w,h);
System.out.println(area);
}
//求面積
public static int getArea(int w,int h) {
return w*h;
}
}
過程1:
1)程序要運(yùn)行,當(dāng)執(zhí)行java命令時(shí),把類的信息MethodTest.class加載到內(nèi)存
2)虛擬機(jī)JVM調(diào)用main方法,主方法壓棧運(yùn)行,在棧中為main方法開辟棧幀,存儲main中出現(xiàn)的局部變量
? int w=5; int h=35;
3)main方法中調(diào)用getArea()方法,棧中為getArea方法開辟棧幀
4)方法壓棧執(zhí)行并為形參賦值 int w=5;int h=7; 計(jì)算結(jié)果并return 35;將結(jié)果返回方法的給調(diào)用者
5)方法getArea執(zhí)行完畢,彈棧釋放內(nèi)存
6)繼續(xù)執(zhí)行main方法中內(nèi)容,棧空間中存儲局部變量int area = 35;getArea方法返回值賦值給area
7)main方法執(zhí)行完畢,彈棧釋放內(nèi)存空間
重載(Method OverLoad)
一般來說,功能點(diǎn)相同的方法才適合使用重載,重載必須滿足如下要求:
①必須是同一個(gè)類
②方法名必須相同
③參數(shù)列表不同public class Demo {
//一個(gè)普通得方法,不帶參數(shù),無返回值
public void add(){
//method body
}
//重載上面的方法,并且?guī)Я艘粋€(gè)整形參數(shù),無返回值
public void add(int a){
//method body
}
//重載上面的方法,并且?guī)Я藘蓚€(gè)整型參數(shù),返回值為int型
public int add(int a,int b){
//method body
return 0;
}
}
注意:方法重載與返回值無關(guān)。
參數(shù)列表不同:
? 參數(shù)的個(gè)數(shù)不同。
? 參數(shù)的對應(yīng)的數(shù)據(jù)類型不同。
? 參數(shù)的順序不同(不同類型的可以交換位置)
遞歸結(jié)構(gòu)
遞歸是一種常見的解決問題的方法,即把問題逐漸簡單化。 遞歸的基本思想就是 自己調(diào)用自己 ”,一個(gè)使用遞歸技術(shù)的方法將會直接或者間接的調(diào)用自己。利用遞歸可以用簡單的程序來解決一些復(fù)雜的問題。比如:大多數(shù)排序使用的就是遞歸算法。
遞歸結(jié)構(gòu)包括兩個(gè)部分:定義遞歸頭。解答:什么時(shí)候不調(diào)用自身方法。如果沒有頭,將陷入死循環(huán)。
遞歸體。解答:什么時(shí)候需要調(diào)用自身方法。public static void print(int i) {
System.out.println(i);
if(i==10){ //遞歸頭
return; //提前結(jié)束方法
}
print(++i); //遞歸
}
public static void main(String[] args) {
print(1); //打印1~10之間的數(shù)據(jù)
}public static void recursion(int i) {
System.out.println("抱著");
if (i==0) { //臨界條件
System.out.println("我的小鯉魚");
} else {
recursion(--i); // 遞歸調(diào)用
}
System.out.println("的我");
}
public static void main(String[] args) {
System.out.println("嚇得我抱起了");
recursion(2);
}
遞歸的缺陷:
簡單的程序是遞歸的優(yōu)點(diǎn)之一。但是遞歸調(diào)用會占用大量的系統(tǒng)堆棧,內(nèi)存耗用多,在遞歸調(diào)用層次多時(shí)速度要比循環(huán)慢的多。所以再使用時(shí)要慎重。
注意:任何可用遞歸解決的問題也能使用迭代解決。但遞歸方法可以更加自然地反映問題,并且易于理解和調(diào)試,并且不強(qiáng)調(diào)效率問題時(shí),可以采用遞歸;
在要求高性能的情況下盡量避免使用遞歸,遞歸調(diào)用既花時(shí)間又耗內(nèi)存。
總結(jié)
以上是生活随笔為你收集整理的java基础深入_java编程基础之方法深入的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: switch java 语法_Java编
- 下一篇: java 读取word书签_Java 添