語句塊
語句塊(有時叫做復合語句)西剥,是用花括號擴起的任意數(shù)量的簡單Java語句。塊確定了局部變量的作用域亿汞。塊中的程序代碼瞭空,作為一個整體,是要被一起執(zhí)行的疗我。塊可以被嵌套在另一個塊呢咆畏。不能在兩個嵌套的塊內(nèi)聲明同名的變量。語句塊可以使用外部的變量吴裤!語句塊中定義的變量作用域只限于語句塊旧找。
【示例1】語句塊
public static void main(String[] args) {
int n;
int a;
{
int k;
int n;? //error – can’t redefine n in inner block
}//k is only defined up to here
}
方法
方法就是一段用來完成特定功能的代碼片段,類似于其它語言的函數(shù)麦牺。
方法用于定義該類或該類的實例的行為特征和功能實現(xiàn)钮蛛。方法是類和對象行為特征的抽象。方法很類似于面向過程中的函數(shù)剖膳。面向過程中魏颓,函數(shù)是最基本單位,整個程序由一個個函數(shù)調(diào)用組成吱晒。面向?qū)ο笾械楸ィ麄€程序的基本單位是類,方法是從屬于類和對象仑濒。
聲明格式:
[修飾符1修飾符2? …]返回值類型方法名(形式參數(shù)列表){
Java語句叹话;… … …
}
方法的詳細說明
形式參數(shù):在方法被調(diào)用時用于接收外界輸入的數(shù)據(jù)。
實參:調(diào)用方法時實際傳給方法的數(shù)據(jù)躏精。
返回值:方法在執(zhí)行完畢后返還給調(diào)用它的環(huán)境的數(shù)據(jù)渣刷。
返回值類型:事先約定的返回值的數(shù)據(jù)類型鹦肿,如無返回值矗烛,必須給出返回值類型void。
方法的調(diào)用方式:
對象名.方法名(實參列表)
注意事項
實參的數(shù)目、數(shù)據(jù)類型和次序必須和所調(diào)用方法聲明的形參列表匹配瞭吃。
return語句終止方法的運行并指定要返回的數(shù)據(jù)碌嘀。
Java中進行方法調(diào)用中傳遞參數(shù)時,遵循值傳遞的原則(傳遞的都是數(shù)據(jù)的副本):
基本類型傳遞的是該數(shù)據(jù)值的copy值歪架。
引用類型傳遞的是對對象的引用的copy值股冗,但指定的是同一個對象。
方法的重載(overload)
方法的重載是指一個類中可以定義有相同的名字和蚪,但參數(shù)不同的多個方法止状。調(diào)用時,會根據(jù)不同的參數(shù)表選擇對應的方法攒霹。
新手雷區(qū):
重載的方法怯疤,實際是完全不同的方法!只是名稱相同而已催束!
構(gòu)成方法重載的藥店:
不同的含義:形參類型集峦,形參個數(shù)不同
只有返回值不同不構(gòu)成方法的重載
如:int a(String str){}與void a(String str){}不構(gòu)成方法重載
只有形參的名稱不同,不構(gòu)成方法的重載
如:int a(String str){}與int a(String s){}不構(gòu)成方法重載
【示例2】方法重載
public class Hello {
int a,b;
int add(int a,int b){
return a+b;
}
/*只有返回值不同抠刺,不構(gòu)成方法重載
double add(int a,int b){
return a+b;
}
*/
int add(int a, double b){
return (int)(a+b);
}
int add(double b,int a){
return (int)(a+b);
}
int add(double a, double b){
return (int)(a+b);
}
Hello(){
}
Hello(int _a){
a = _a;
}
Hello(int _a,int _b){
a = _a;
b = _b;
}
public static void main(String[] args){
System.out.println(new Hello().add(3,4.5));
System.out.println(new Hello().add(5.5, 6));
System.out.println(new Hello().add(4,6));
}
}
示例2運行效果圖
遞歸結(jié)構(gòu)
遞歸是一種常見的解決問題的方法塔淤,即把問題逐漸簡單化。遞歸的基本思想就是“自己調(diào)用自己”速妖,一個使用遞歸技術(shù)的方法將會直接或者間接的調(diào)用自己高蜂。
利用遞歸可以用簡單的程序來解決一些復雜的問題。比如:大多數(shù)排序使用的就是遞歸算法罕容。
遞歸結(jié)構(gòu)包括兩個部分:
定義遞歸頭妨马。解答:什么時候不調(diào)用自身方法。如果沒有頭杀赢,將陷入死循環(huán)烘跺。
遞歸體。解答:什么時候需要調(diào)用自身方法脂崔。
【示例3】計算n!
public class A {
static long? factorial(int n){
if(n==1){
return 1;
}else{
return n*factorial(n-1);
}
}
public static void main(String[] args) {
long d1 = System.currentTimeMillis();
System.out.printf("%d階乘的結(jié)果:%s%n",10,factorial(10));
long d2 = System.currentTimeMillis();
System.out.printf("遞歸費時:%s%n",d2-d1);? //耗時:32ms
}
}
示例3運行效果圖
圖1遞歸原理分析圖
遞歸的缺陷
簡單的程序是遞歸的優(yōu)點之一滤淳。但是遞歸調(diào)用會占用大量的系統(tǒng)堆棧,內(nèi)存耗用多砌左,在遞歸調(diào)用層次多時速度要比循環(huán)慢的多脖咐。所以再使用時要慎重。
比如上面的遞歸耗時44ms汇歹。但是用普通循環(huán)的話快得多屁擅,如示例4示
【示例4】使用循環(huán)求n!
public class A{
public static void main(String [] args){
long d3 = System.currentTimeMillis();
int a = 10;
int result = 1;
while (a>1) {
result *= a*(a-1);
a-=2;
}
long d4 = System.currentTimeMillis();
System.out.println(result);
System.out.printf("普通循環(huán)費時:%s%n",d4-d3);? //結(jié)果為0.
}
}
示例4運行效果圖
注意事項
任何可用遞歸解決的問題也能使用迭代解決。當遞歸方法可以更加自然地反映問題产弹,并且易于理解和調(diào)試派歌,并且不強調(diào)效率問題時,可以采用遞歸;
在要求高性能的情況下盡量避免使用遞歸胶果,遞歸調(diào)用既花時間又耗內(nèi)存匾嘱。
「全棧Java筆記」是一部能幫大家從零到一成長為全棧Java工程師系列筆記。筆者江湖人稱 Mr. G早抠,10年Java研發(fā)經(jīng)驗霎烙,曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設計及研發(fā)工作蕊连,從小白逐漸做到工程師悬垃、高級工程師、架構(gòu)師甘苍。精通Java平臺軟件開發(fā)盗忱,精通JAVAEE,熟悉各種流行開發(fā)框架羊赵。
筆記包含從淺入深的六大部分:
A-Java入門階段
B-數(shù)據(jù)庫從入門到精通
C-手刃移動前端和Web前端
D-J2EE從了解到實戰(zhàn)
E-Java高級框架精解
F-Linux和Hadoop