目錄
1、配置java 環(huán)境
2、java代碼規(guī)范
3、java筆記
4、java程序編寫
配置java環(huán)境
1、下載java 所需要的JDK (我下載的時(shí)1.8版本)地址: 地址JDK
2、下載IDEA 地址:IDEA地址
3、填寫注冊(cè)服務(wù)器 http://idea.iteblog.com/key.php
java代碼規(guī)范
1、java關(guān)鍵字都是小寫的,絕對(duì)不是大寫開(kāi)頭的
2、java標(biāo)識(shí)符命名規(guī)則
(1)由字母、數(shù)字、下劃線、$組成、但是不能以數(shù)字開(kāi)頭(字母可以是中文、日文等)
(2)大小寫敏感
(3)不能使用java中的關(guān)鍵字和保留字 比如說(shuō)goto
(4)不用java中內(nèi)置的類名 比如說(shuō)System
(5)類名和文件名要一致,首字母大寫
3、類名首字母要大寫 '
java筆記
常量:程序中固定不變化的值
變量的定義:表示存儲(chǔ)空間,可以用來(lái)存放一類型的常量,沒(méi)有固定的值,并可以重復(fù)使用,可以存儲(chǔ)某種類型的未知數(shù)據(jù)
變量的特點(diǎn):1、占據(jù)著內(nèi)存中的某一塊區(qū)域2、可以重復(fù)使用3、該區(qū)域的數(shù)據(jù)可以在同一個(gè)類型范圍內(nèi)變化
變量的分類:變量根據(jù)定義的位置不同分為兩大類 1:成員變量/字段:直接定義在類的{}中的變量(方法外)2:局部變量:定義在方法中的變量 變量除了成員變量就是局部變量
作用域:1、成員變量(在所定義的類中起作用)2、局部變量(從定義的第一個(gè)地方開(kāi)始,緊跟著第一個(gè)}結(jié)束)
注意:1、成員變量必須定義在方法中才能夠引用,否則不能實(shí)現(xiàn) 2、變量必須先聲明,并且初始化才能夠使用 3、聲明變量必須要有數(shù)據(jù)類型 4、同一個(gè)作用域內(nèi)變量名不能夠重復(fù)
三元運(yùn)算符:和oc一樣,數(shù)據(jù)類型 變量 = boolean表達(dá)式?值1:值2(如果:boolean表達(dá)式結(jié)果為ture,三元運(yùn)算表達(dá)式結(jié)果就是值1,如果是false那么三元表達(dá)式結(jié)果就是值2)
方法定義方法(method)函數(shù)(function)其實(shí)就是值一個(gè)特定的功能操作:
JAVA方法的調(diào)用:1、靜態(tài)方法不能夠調(diào)用非靜態(tài)方法
實(shí)現(xiàn)方法的調(diào)用:帶static的是類方法,不帶的是實(shí)例方法,那么實(shí)現(xiàn)類方法的就可以直接“.”出來(lái),反而實(shí)例的時(shí)候需要new出來(lái)2、java方法中的main方法是由jvm(java虛擬機(jī))來(lái)調(diào)用的,我們只需要啟動(dòng)jvm就可以了,因?yàn)閙ain是主入口。
java方法定義的格式:[修飾符]返回值類型 方法名稱([形參1,形參2]){
方法體:
[如果方法需要給調(diào)用者返回一個(gè)結(jié)果,此時(shí)使用return值];
}
方法中的術(shù)語(yǔ):
修飾符:public,static修飾的方法屬于類,直接使用類名調(diào)用即可,現(xiàn)在都使用static進(jìn)行修飾
返回值類型:方法其實(shí)是在完成一個(gè)功能,該功能操作完畢之后,是否需要給調(diào)用者一個(gè)結(jié)果,如果不需要給調(diào)用者返回結(jié)果,此時(shí)使用關(guān)鍵字void來(lái)聲明,無(wú)返回值的意思。
方法名稱:遵循標(biāo)識(shí)符的規(guī)范,使用動(dòng)詞表示,首字母小寫,若是多個(gè)單詞組成,使用駝峰表達(dá)式進(jìn)行。
形式參數(shù):方法圓括號(hào)中的變量,僅僅只是站位而已,參數(shù)的名稱其實(shí)無(wú)所謂,形式參數(shù)可以有多個(gè)。
參數(shù)列表:參數(shù)列表==參數(shù)的類型+參數(shù)的個(gè)數(shù)+參數(shù)的順序
方法簽名:方法簽名==方法名稱+方法參數(shù)列表 在同一個(gè)類中方法簽名是唯一的(eg:doWork(int a,int b))其實(shí)就是方法的名稱在一個(gè)類當(dāng)中是唯一的意思。
方法體:方法中{}中的代碼,表示具體完成該方法功能的代碼
返回值:1、在方法內(nèi)部使用return的關(guān)鍵字 2、功能 :給調(diào)用者返回一個(gè)結(jié)果值,此時(shí)該方法不能使用void進(jìn)行修飾 3、功能:結(jié)束當(dāng)前的方法
針對(duì)于有返回值的方法,調(diào)用者需要定義一個(gè)變量去接受返回值的類型結(jié)果
實(shí)際參數(shù):調(diào)用者調(diào)用某個(gè)具體方法的時(shí)候,實(shí)際傳遞的參數(shù)值
如何定義方法:
到底需要定義什么功能方法?
是否需要定義返回值類型的問(wèn)題?
答:我們說(shuō)方法其實(shí)就是在完成某個(gè)功能,那么我們完成該功能之后是否需要返回?cái)?shù)據(jù),如果不需要?jiǎng)t用void進(jìn)行返回,如果需要返回一個(gè)結(jié)果,我們就把結(jié)果數(shù)據(jù)的類型作為好該方法的返回值類型。
eg:求兩者之和,我們?cè)诤醯氖欠椒▓?zhí)行的過(guò)程,并且執(zhí)行完畢之后,需要給調(diào)用者一個(gè)反饋
是否需要形式參數(shù)?
答:該方法在完成該功能的過(guò)程之中,是否有未知的因素參與,如果有請(qǐng)作為參數(shù)傳遞,如果沒(méi)有則沒(méi)有形參。
eg:求兩者之和,這兩個(gè)數(shù)到底是什么其實(shí)對(duì)于方法來(lái)講是未知的,僅僅只是調(diào)用者知道,并且調(diào)用者不同的參數(shù)值
方法重載判斷原則:1、定義:在同一個(gè)類中,某個(gè)方法允許在一個(gè)以上的同名方法,只要他們的參數(shù)列表不同就可以 2、作用屏蔽了同一個(gè)功能的方法由于參數(shù)不同所造成方法名稱不同。3、原則:“”兩同一不同(兩同:同類中,方法名相同 一不同:方法參數(shù)列表不同)??:方法重載和方法的返回值類型無(wú)關(guān),只是一般要求返回類型一致.并且即便沒(méi)有形參也是可以的
例子:getSum(1,2); /*這個(gè)地方系統(tǒng)會(huì)自動(dòng)判斷出來(lái)你選擇的是哪個(gè)方法 */getSum(1.2,1.1);/*調(diào)用double*/ (雖然方法是相同的,但是形參是不同的,所以可以使用重載模式)
JVM內(nèi)存分化,認(rèn)為的根據(jù)不同內(nèi)存空間的存儲(chǔ)以及存儲(chǔ)的數(shù)據(jù)
程序計(jì)數(shù)器:當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)指示器.
本地方法棧:為虛擬機(jī)使用的native方法服務(wù)
java虛擬機(jī):描述java方法執(zhí)行的內(nèi)存模型,每個(gè)方法被執(zhí)行的時(shí)候都會(huì)同時(shí)創(chuàng)建一個(gè)棧幀用于存儲(chǔ)局部變量表,操作棧,動(dòng)態(tài)鏈接,方法出口等信息??:每一個(gè)方法創(chuàng)建一個(gè)棧幀,棧幀存放了當(dāng)前方法的數(shù)據(jù)類信息(局部變量)當(dāng)前方法調(diào)用完畢,該方法的棧幀就被銷毀了。
java堆:被所有的線程共享的一塊內(nèi)存區(qū)域,在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建,所有的對(duì)象實(shí)例以及數(shù)組都要在堆上分配(使用new關(guān)鍵字,就是代表在堆中開(kāi)辟了一塊新的空間)
方法區(qū):線程共享的內(nèi)存區(qū)域,存儲(chǔ)已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量即時(shí)編譯器編譯后的代碼數(shù)據(jù)等(這個(gè)區(qū)域的內(nèi)存回收目標(biāo)主要是針對(duì)常量池的回收和對(duì)類型的卸載)
棧:后進(jìn)先出,因?yàn)楹筮M(jìn)來(lái)的是在最上面,棧當(dāng)中是引用堆當(dāng)中的地址也就是說(shuō)當(dāng)中放的就是0x******
堆:先進(jìn)先出,new就代表在堆空間儲(chǔ)存數(shù)據(jù),再往底層說(shuō)其實(shí)他是存儲(chǔ)地址的就是16進(jìn)制的地址0x********,若堆中的內(nèi)存空間沒(méi)有被引用時(shí)候,就變成了垃圾,就等著垃圾回收器來(lái)回收。
GC(Garbage Collection):垃圾回收器:
java的自動(dòng)垃圾回收機(jī)制:簡(jiǎn)單理解為,程序員不用手動(dòng)的控制內(nèi)存的釋放每當(dāng)jvm發(fā)覺(jué)內(nèi)存資源緊張的時(shí)候,就會(huì)自動(dòng)的清除無(wú)用的對(duì)象(沒(méi)有被引用到的對(duì)象)所占的內(nèi)存空間 .?? java的垃圾回收器,自動(dòng)回收的是堆空間的內(nèi)存,而棧空間內(nèi)存會(huì)隨著該方法的執(zhí)行結(jié)束,自動(dòng)釋放該方法的棧幀內(nèi)存。
什么是數(shù)組:
數(shù)組:是在程序設(shè)計(jì)中,為了方便,把具有相同類型的若干個(gè)變量按照有序的形式組織在一起的數(shù)據(jù)形式,這些按一定順序排列的同類型數(shù)據(jù)的幾個(gè)成為數(shù)組。而數(shù)組中的每一個(gè)數(shù)據(jù)稱之為數(shù)組元素,數(shù)組元素以索引表示其數(shù)組的位置,索引從0開(kāi)始,步長(zhǎng)是1,有點(diǎn)像excel表格的行號(hào),逐步遞增,好比賓館的房號(hào)
基本數(shù)據(jù)類型:byte short int long float double char boolean
引用數(shù)據(jù)類型:類 接口 數(shù)組
數(shù)組的定義:
方式1:數(shù)組元素的類型[] 數(shù)組名; int[] ages; 推薦使用
方式2:數(shù)組元素的類型 數(shù)組名[];int ages[];
??:數(shù)組是必須初始化的,才能使用4 因?yàn)槌跏蓟艜?huì)分配空間
數(shù)組初始化方式:
靜態(tài)初始化:特點(diǎn)就是由我們?yōu)槊恳粋€(gè)數(shù)組元素進(jìn)行設(shè)置初始值,而數(shù)組的長(zhǎng)度系統(tǒng)自動(dòng)分配
語(yǔ)法:數(shù)組元素類型[] 數(shù)組名 = new數(shù)組元素類型[] {元素1,元素2,元素3,........};
int[] num = new int []{1,3,5,7,9};
簡(jiǎn)單寫法 (必須聲明之后立刻初始化,不能聲明之后再初始化):int [] num = {1,3,5,7,9};
int [] num = new int[]{1,3,4,5}; (1、聲明一個(gè)int 類型的數(shù)組 2、初始化數(shù)組 3、把初始化的數(shù)據(jù)賦值給num變量)
System.out.println(num.length);
num = new int[]{2,4,8};
System.out.println(num.length);
這里我總結(jié)下上面的這四句代碼的意思:首先我在堆當(dāng)中創(chuàng)建了一塊內(nèi)存空間,然后我在里面存儲(chǔ)了1345,然后我在用棧當(dāng)中的num變量進(jìn)行引用取到了這這塊地址當(dāng)中的1345,再之后我又new了一塊地址,存儲(chǔ)248 ,之后我同樣用num這個(gè)變量存儲(chǔ)這個(gè)地址下面的元素,將之前的num的值進(jìn)行覆蓋,所以之后輸出的num值是248,解釋完畢
動(dòng)態(tài)初始化:
由我們來(lái)設(shè)置數(shù)組的元素個(gè)數(shù)(數(shù)組長(zhǎng)度)而每一個(gè)數(shù)組元素的初始值由系統(tǒng)決定.
語(yǔ)法: 數(shù)組元素類型[] 數(shù)組名 = new 數(shù)組元素類型[length];
eg.:int [ ] args = new int [100];
/*數(shù)組的動(dòng)態(tài)初始化操作*/
int [] num = new int[3];
System.out.println(num.length);
num = new int[5];
System.out.println(num.length);
這里我在對(duì)上面的四句代碼進(jìn)行解釋:實(shí)際上也是分兩次在堆當(dāng)中進(jìn)行分配內(nèi)存空間,每次新開(kāi)辟空間都是不一樣的地址。那么num在棧當(dāng)中分別引用了第一個(gè)空間和第二個(gè)空間。所以兩次打印num的長(zhǎng)度是不一樣的(第一次是3第二次是5)
什么時(shí)候使用靜態(tài)初始化,什么時(shí)候使用動(dòng)態(tài)初始化?
答:事先知數(shù)組元素是什么的時(shí)候使用靜態(tài)初始化,當(dāng)我們不知道的時(shí)候我們使用動(dòng)態(tài)初始化。
??:無(wú)論用哪種方式初始化數(shù)組,一旦初始化完成嗎數(shù)組的長(zhǎng)度就是固定的了,數(shù)組中的元素個(gè)數(shù)就已經(jīng)固定了,不能改變,如果需要更改只能重新做初始化
??:不能同時(shí)使用靜態(tài)初始化數(shù)組和動(dòng)態(tài)初始化數(shù)組
數(shù)組的基本操作:
1、獲取元素:元素類型 變量 = 數(shù)組的名稱[index];
2、設(shè)置元素:數(shù)組名[index] = 值;
3、遍歷元素:建議使用for循環(huán)
4、數(shù)組長(zhǎng)度:數(shù)組名.length;length不是屬性,不是方法
5、索引范圍:從0開(kāi)始,逐一遞增,[0,數(shù)組名.length-1];
數(shù)據(jù)類型:
/*final 是不能被更改的意思 使用之后就不能被賦值*/
final int bill = 100;
/*八進(jìn)制 和 十六進(jìn)制*/
八進(jìn)制是0開(kāi)頭的數(shù) 十六進(jìn)制的數(shù)0X開(kāi)頭的數(shù)
數(shù)據(jù)類型轉(zhuǎn)換的過(guò)程中,如果出現(xiàn)遠(yuǎn)算表達(dá)式,表達(dá)式的結(jié)果按照最大的類型進(jìn)行輸出(比如:float 和 long 進(jìn)行相加那么最后的結(jié)果一定是float類型的,因?yàn)閒loat類型更大)
有小數(shù)點(diǎn)的數(shù)模認(rèn)為double 而不是float 如果想定義float 必須在1.0后面加上F,譬如1.0F。
四舍五入:/*原本四舍五入實(shí)現(xiàn)的結(jié)果是long類型的*/
/*四舍五入*/
int d = (int)Math.round(-10.9);
System.out.println(d);
字符和字符串:
字符 '你' 字符串 “你妹”
逃逸字符: 主要體現(xiàn)在\"\" 把字符串進(jìn)行包括
System.out.println("請(qǐng)分別輸入\"5 7\"");
&&和||:
&&兩者都為都為true才是true || 兩者都為false才是false
運(yùn)算符優(yōu)先級(jí): !> && > ||
循環(huán)語(yǔ)句: while 和 do while do while 代表先循環(huán)后判斷 而while 代表先判斷再循環(huán)
int type = 1;
do {
type ++ ;
}while (type>3);
System.out.println(type);
break和continue的區(qū)別:
break 是跳出當(dāng)前所有循環(huán)判斷 continue是跳出當(dāng)前循環(huán)判斷 然后繼續(xù)往下走。如果是多層嵌套break只能跳出一層循環(huán).但是如果我想跳出多層循環(huán)怎么辦呢?我們需要在循環(huán)前放一個(gè)標(biāo)志,然后break這個(gè)標(biāo)志就可以了。我們?cè)趂or循環(huán)之前加一個(gè)標(biāo)志。然后break 標(biāo)志;就OK了。
數(shù)組:
數(shù)組遍歷 初始化:
隨機(jī)數(shù)的書(shū)寫方式 :(int)(Math.random()*100)
int [] hour = new int[(int)(Math.random()*100)];
System.out.println(hour.length);
for(int i =0 ;i<hour.length;i++){
System.out.println(hour[i]);
}
數(shù)組遍歷的另一種書(shū)寫方式
for(int k : hour){
System.out.println(hour[k]);
}
函數(shù):簡(jiǎn)單求和第一種
public class Hello {
public static void cal (int a ,int b){
int i = 0;
int sun = 0;
for (i = a;i<=b;i++){
sun += i;
}
System.out.println(sun);
}
public static void main(String[] args){
cal(1,10);
cal(30,40);
}
}
簡(jiǎn)單求和第二種
public class Hello {
public static int sum (int i,int o){
int sum = 0;
for (int a = i;i<o;i++){
sum += i;
return sum;
}
}
public static void main(String[] args){
System.out.println("sum from "+ sum(1,10));
}
}
new一個(gè)字符串的操作都包含了哪些操作?
string a = new String("this is a string");
1、創(chuàng)建一個(gè)string 對(duì)象
2、用this is a string 初始化這個(gè)對(duì)象
3、創(chuàng)建管理這個(gè)對(duì)象的變量a
4、讓a管理這個(gè)對(duì)象
注:我們這里修改兩個(gè)字符串將兩個(gè)字符串進(jìn)行賦值,那么這兩個(gè)字符串a(chǎn)、b其實(shí)管理者一個(gè)對(duì)象,那么就像數(shù)組一樣如果a[]==b[],那么如果進(jìn)行了賦值,那么給數(shù)組a更改之后,如果輸出數(shù)組b那么數(shù)組b也會(huì)被更改。
變量:本地變量 與 成員變量
本地變量:在方法里重新定義的變量叫本地變量
成員變量:不是重新定義在方法里的,原本就存在的叫成員變量
繼承:
public class Main extends china.china {
hello text = new hello();
}
java方法調(diào)用
public class Main { public static void main(String[] args) { System.out.println("Hello World!"); Main.doWork(); } static void doWork(){ System.out.println("我是你爸爸");//調(diào)用方法 } public static void work(){ System.out.println("我是你的二號(hào)爸爸"); }}
java程序編寫
public class Main { public static void main(String[] args) { System.out.println("我是你爸爸"); }}
三元表達(dá)式
public class Main { public static void main(String[] args) { double num = 3.51; int num1 = (int)num; double num2 = num - num1; int result = num2>= 0.5 ? num1+1 :num1; System.out.println(result); }}
java 無(wú)參數(shù)無(wú)返回值 無(wú)參數(shù)有返回值 有參數(shù)無(wú)返回值 有參數(shù)有返回值 demo
public class Main { public static void main(String[] args) { System.out.println("Hello World!"); Main.doWork(); Main.p();/*調(diào)用*/ Main.pValue("hello");//調(diào)用 int age = Main.getAge(); System.out.println(age); int sum = Main.getSum(3,4); System.out.println(sum); } /*無(wú)參數(shù) 無(wú)返回*/ /*需求 :定義一個(gè)方法專門打印---------*/ static void p(){ System.out.println("---------");//調(diào)用方法 } /*有參數(shù) 無(wú)返回值*/ /*需求:打印任意值*/ static void pValue(String va){ System.out.println(va);//傳遞這個(gè)string參數(shù) } /*無(wú)參數(shù) 有返回值*/ /*需求:返回我的年齡*/ static int getAge(){ return 17; } /*有參數(shù)有返回值*/ /*求兩個(gè)數(shù)之和*/ static int getSum(int a,int b){ return a+b; } static void doWork(){ System.out.println("我是你爸爸");//調(diào)用方法 } public static void work(){ System.out.println("我是你的二號(hào)爸爸"); }}
java實(shí)現(xiàn)發(fā)短信功能(帶參 帶返)
public class Main { public static void main(String[] args) { System.out.println("Hello World!"); int ret = sendMsg("10086","愛(ài)過(guò)"); int temp = sendMsg("10010","另一個(gè)內(nèi)容"); } /*實(shí)現(xiàn)一個(gè)發(fā)送短信的例子*/ //方法名稱 sendMsg /*0:發(fā)送失敗 1:發(fā)送成功 2:對(duì)方已經(jīng)接收 * */ static int sendMsg(String phoneNum, String content){ /*發(fā)送短信的邏輯代碼*/ return int 類型的值; }}
java實(shí)現(xiàn)登錄功能
/*實(shí)現(xiàn)登錄功能*/static boolean login (String username,String password){ /*實(shí)現(xiàn)登錄檢查賬號(hào)密碼是不是正確*/ /*做判斷返回bool類型的值*/ }
java實(shí)現(xiàn)遞歸算法
需求如下,高中數(shù)學(xué)數(shù)列的時(shí)候,我們見(jiàn)過(guò)菲波納契數(shù)列,其公式為:F(0)=0,F(xiàn)(1)=1,F(xiàn)n = F(n-1)+F(n-2),現(xiàn)在求F(5)的值,怎么實(shí)現(xiàn)呢?
代碼如下public class Main { public static void main(String[] args) { System.out.println("Hello World!"); int ret = fn(6); System.out.println(ret); } static int fn (int n){ if (n==0){ return 0; } else if(n==1){ return 1; }else { return fn(n-1)+fn(n-2); } }}
這樣就是實(shí)現(xiàn)了遞歸的代碼編寫
sout 輸出語(yǔ)句
psvm 創(chuàng)建一個(gè)類
java程序常見(jiàn)報(bào)錯(cuò)信息(控制臺(tái))
java.lang.NullPointerException----代表空指針異常或者叫做空引用異常(當(dāng)數(shù)組還未初始化 就直接操作數(shù)組就會(huì)空指針異常)
ArrayIndexOutOfBoundsException------數(shù)組的索引越界異常(簡(jiǎn)單來(lái)說(shuō)就是數(shù)組一共五個(gè)元素,你去區(qū)第六個(gè)就會(huì)出現(xiàn)這個(gè)問(wèn)題)
字符串進(jìn)行拼接
Scanner in = new Scanner(System.in);
/*in.nextLine 的意思 是讓in 去做nextLine的動(dòng)作 ()的意思就是 一個(gè)動(dòng)作. 如果把數(shù)字放在 前面進(jìn)行 + 那么他會(huì)先運(yùn)行前面證書(shū)的加法,如果放在后面則會(huì)讓整數(shù)類型的數(shù)依次拼接到前面字符串后面。因?yàn)檫\(yùn)算從左到右進(jìn)行遠(yuǎn)算的 所以才會(huì)出現(xiàn)這樣的現(xiàn)象*/
// System.out.println(in.nextLine());
/*字符串進(jìn)行拼接 */
System.out.println("Answer:"+in.nextLine());
簡(jiǎn)單的減法運(yùn)算
public class Hello {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
/*初始化變量*/
int price = 0;
/*<類型名稱><變量名稱> = <初始值>*/
/*進(jìn)行手動(dòng)賦值*/
price = in.nextInt();
int chage = 100-price;
System.out.println(chage);
}
}