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