為了能夠了解程序員大師們的解題思路熟菲,以便對(duì)癥下藥的解決問題,開始學(xué)習(xí)java知識(shí),目標(biāo)是能讀懂代碼邏輯铣揉。這里記錄下近期的學(xué)習(xí)知識(shí)。
- 源文件(比如party.java)經(jīng)過編譯(自動(dòng))后生成.class文件(paryt.class)餐曹,java虛擬機(jī)運(yùn)行.class文件輸出結(jié)果
- 聲明和賦值
int x = 3; //將數(shù)字3賦值給x逛拱,x被聲明為int類型,注意以英文分號(hào)結(jié)束語句台猴。
- 注釋朽合,不被代碼執(zhí)行的部分。
//雙斜杠是注釋
/*
這也是注釋
*/
- 類-方法饱狂;方法是能夠獨(dú)立實(shí)現(xiàn)功能的程序片段曹步;方法有靜態(tài)方法(有關(guān)鍵字static,可以直接調(diào)用)和實(shí)例方法(沒有關(guān)鍵字static休讳,必須先實(shí)例化(new)才能調(diào)用)
public class Dog{//public:公開給其他類讲婚,class類聲明,Dog是類名稱(自瓤∪帷)筹麸,必須有花括號(hào)活合。
int size;
String bread;
String name;
void bark(){//bark()是方法,必須有小括號(hào)物赶,方法必須在類里面白指。
//在方法的花括號(hào)中編寫方法應(yīng)該執(zhí)行的指令
if (size>60){//if判斷,當(dāng)小括號(hào)內(nèi)為true時(shí)執(zhí)行大括號(hào)內(nèi)語句
System.out.println("woof!woof!")
} else if (size >14){//注意判斷條件酵紫,逐級(jí)降低
System.out.println("Ruff!Ruff!")
} else {//上面條件都不滿足時(shí)告嘲,執(zhí)行本代碼塊內(nèi)語句
System.out.println("Yip!Yip!")
}//結(jié)束if判斷
}//方法結(jié)束
}//類結(jié)束
編寫測(cè)試用的類
class DogTestDrive{
public static void main (String[] args){
Dog d = new Dog(); //Dog d 聲明一個(gè)引用變量,new Dog() 創(chuàng)建一個(gè)對(duì)象奖地,= 將新的Dog()對(duì)象賦值給d這個(gè)引用變量橄唬。
d.size = 40; //賦值(圓點(diǎn)運(yùn)算符)
d.bark(); //調(diào)用方法
}
}
- System.out.print,當(dāng)前行輸出鹉动;System.out.println轧坎,新起一行輸出
- 數(shù)組的聲明、創(chuàng)建泽示、調(diào)用和元素統(tǒng)計(jì)
String [] pets = {"dog","cat","rabbit"} //每個(gè)元素都要被引號(hào)包裹缸血,元素間用逗號(hào)分隔
//java數(shù)組坐標(biāo)是從0開始的,比如我要取第一個(gè)元素
String s = pet[0] // "dog"
//統(tǒng)計(jì)數(shù)組內(nèi)元素個(gè)數(shù)
int x = pet.length // 3
- 變量的聲明必須有類型和名稱
- 方法可以有多個(gè)參數(shù)械筛,在聲明的時(shí)候用逗號(hào)分開捎泻,傳入時(shí)也逗號(hào)分開
void go(){
TestStuff t = new TestStuff();
t.takeTwo(12,34);
}
void takeTwo(int x, int y){//聲明一個(gè)擁有兩個(gè)int參數(shù)的方法,方法名分別是x埋哟,y笆豁。12傳給了x,34傳給了y赤赊,12/34是實(shí)參闯狱,x/y是形參,按順序賦值抛计。注意哄孤,類型相同!
int z = x+y;
System.out.println(z);
}
- 實(shí)例變量聲明在類內(nèi)吹截,有默認(rèn)值瘦陈,可不用初始化
- 局部變量聲明在方法中,沒有默認(rèn)值波俄,在使用前必須初始化
- 使用==比較兩個(gè)primitive主數(shù)據(jù)類型晨逝,或者判斷兩個(gè)引用是否引用同一個(gè)對(duì)象
- 使用equals() 來判斷兩個(gè)對(duì)象是否在意義上相等
- 實(shí)力變量要標(biāo)記為private,并通過getter與setter來存取懦铺,以確保實(shí)例變量值在合法范圍內(nèi)捉貌。
- for循環(huán)(加強(qiáng)版)
String [] s = {"a","b","c"}
for(String i:s){//注意變量類型一致String,i迭代尋找s里的每一個(gè)值,':'相當(dāng)于in
System.out.println(i)
}
- for循環(huán)(基礎(chǔ)版)
for(int i=0;i<100;i++){//int i=0:初始化昏翰;i<100:判斷條件苍匆;i++:后遞增運(yùn)算符
System.out.println(i)
}
- 產(chǎn)生隨機(jī)數(shù)
//randomNum:聲明的一個(gè)保存隨機(jī)數(shù)的變量
//(int):類型轉(zhuǎn)換,把Math.random()*5的結(jié)果(double類型)轉(zhuǎn)換成int類型
//Math:Java內(nèi)建類棚菊,random()是其中一個(gè)方法,會(huì)產(chǎn)生一個(gè)介于0-1的小數(shù)
int randomNum = (int)(Math.random()*5)
- ArrayList類叔汁,讀取快统求,是個(gè)對(duì)象,要用.運(yùn)算符調(diào)用他的方法
1据块,創(chuàng)建
ArrayList<Egg> myList = new ArrayList<Egg>();
//<>限制類型另假,也就是這個(gè)ArrayList只接受Egg的對(duì)象
2己莺,加入元素
Egg s= new Egg();
myList.add(s);
3,查詢大小
int theSize = myList.size();
4,查詢特定元素
boolean isIn = myList.contains(s);
5,判斷集合是否為空
boolean empty = myList.isEmpty()案怯;
6,刪除元素
myList.remove(s); - LinkedList 插入刪除快,可以頭尾添加
LinkedList<String> ln = new LinkedList<String>();
ln.add("a");
ln.addFirst("a0");//頭添加
ln.addLast("b");//尾添加
String f = ln.getFirst();//取頭數(shù)據(jù)
String l = ln.getLast();//取尾數(shù)據(jù)
- List接口允許重復(fù)昆著,Set接口不可重復(fù),HashSet查詢快,TreeSet排序;
HashSet<String> hs = new HashSet<String>();
hs.add("a");
hs.add("b");
hs.add("a");
System.out.println(hs);//a,b
TreeSet<String> ts = new TreeSet<String>();
ts.add("c");
ts.add("a");
ts.add("b");
System.out.println(ts);//a,b,c
Map接口是一組成對(duì)的對(duì)象key-value驰徊,key不可重復(fù)。HashMap是無序的,TreeMap能夠根據(jù)key自動(dòng)排序捐韩。
“與”和“或”運(yùn)算符(&&,||)鹃锈,不等于荤胁!=
引入,使用import屎债,比如引入ArrayList: import java.util.ArrayList; 放在代碼最頂部
繼承:extend仅政,減少子類中代碼重復(fù),子類可以直接使用父類中的實(shí)力變量和方法盆驹。構(gòu)造方法(方法名與類名相同圆丹,沒有返回值)不能被繼承
//語法
class 子類名 extends 父類名 {}
- 覆蓋:由子類重新定義繼承下來的方法,以改變或者延伸方法
- 多態(tài)下躯喇,引用和對(duì)象可以是不同的類型辫封,比如Animal myDog = new Dog();引用類型可以是實(shí)際對(duì)象類型的父類硝枉。
- 參數(shù)和返回類型也可以多態(tài)(注意PetOwner里調(diào)用giveShot方法傳參d,h都是Animal a的子類)
class Vet{
public void giveShot(Animal a){
//a參數(shù)可以用任何Animal的類型對(duì)象來當(dāng)傳入
//當(dāng)執(zhí)行到makeNoise()的時(shí)候倦微,不管它引用的對(duì)象是什么妻味,該對(duì)象都會(huì)執(zhí)行makeNoise()
a.makeNoise();
}
}
class PetOwner{
public void start(){
Vet v = new Vet();
Dog d = new Dog();
Hippo h = new Hippo();//Animal的子類即可
v.giveShot(d);//會(huì)執(zhí)行Dog的makeNoise();
v.giveShot(h);//會(huì)執(zhí)行Hippo的makeNoise();
}
- 方法的重載(overload),兩個(gè)方法的名稱相同欣福,但是參數(shù)類型责球、個(gè)數(shù)不同。
public class Overloads{
String uniqueID;
public int addNums(int a ,int b){
return a+b;
}
public double addNums(double a ,double b){
//這里的方法名稱相同劣欢,但是方法的返回值類型棕诵,參數(shù)類型不同
return a+b;
}
}
- 抽象類(不能被實(shí)例化(new)的類)關(guān)鍵詞“abstract”,抽象類的目的就是被繼承凿将,除此之外沒別的意義,比如Animal
- 不是抽象的類就是具體類价脾,比如Dog牧抵,Cat
- 抽象的方法,沒有實(shí)體侨把。如果聲明出一個(gè)抽象方法犀变,那么就一定要放在抽象類里面,不能非抽象類內(nèi)聲明抽象方法秋柄。好處就是--多態(tài)获枝,所有子類都能用到這些抽象方法
public abstract void eat();//分號(hào)結(jié)尾沒有方法體{}
- this關(guān)鍵字,表示對(duì)當(dāng)前對(duì)象的調(diào)用
- final關(guān)鍵字骇笔,在類前面:阻止繼承省店;在方法前面:阻止方法覆蓋;在屬性前面:常量
- 接口
//語法
[public][abstract] interface interfaceName{}
- 實(shí)現(xiàn)接口笨触,使用關(guān)鍵字implement懦傍,一個(gè)類必須實(shí)現(xiàn)接口中的所有方法,一個(gè)類可以實(shí)現(xiàn)多個(gè)接口芦劣,用逗號(hào)隔開粗俱。
- 內(nèi)部類的引用類型轉(zhuǎn)換:向上轉(zhuǎn)換Dog——>Animal;向下轉(zhuǎn)換Animal——>Dog
- 里氏代換原則:父類出現(xiàn)的地方虚吟,子類一定可以出現(xiàn)
public class Test{
public static void main(String [] args){
Pet cat = new Cat();//向上轉(zhuǎn)換
Pet dog = new Dog();
Person per = new Person();//new一個(gè)對(duì)象
per.care(cat);//調(diào)用care方法
per.care(dog);//里氏代換寸认,帶還了父類里的Pet
}
}
interface Pet{//定義接口
public void run();
}
class Person{
public void care(Pet p){
p.run();
}
}
class Cat implements Pet{//實(shí)現(xiàn)接口
public void run(){
System.out.println("cat run...")
}
}
class Dog implements Pet{
public void run(){
System.out.println("dog run...")
}
}