前言
必須先來一句,這是入門級別,高手勿噴~
寫Android的時候總有一些語句不是很理解,其實大部分是Java的內容,所以想系統的學下Java。
這本書——《Java逍遙游記》是在圖書館偶然看到的,被橫放在書架上,看來是被人翻過直接丟那里了,索性拿來看一看。
很基礎的一本書,廢話很多,比如孫悟空想學編程什么什么的,但可以理解作者的一片苦心。既然如此水,那就把它借回來想快速掃一下以增加成就感,用一種查漏補缺的態度,看到哪里不會就記下來,最終目標就是這本書就作廢了,對我有價值的東西都在筆記上,所以就有了這幾篇筆記。
Anyway,一千個人眼中有一千個哈姆雷特,我記下的東西不一定適合所有人,這里面既有Java的內容,也有些是我在學C++的時候的一些遺漏(語言都是相通的~),所以抱着交流學習的態度的同時更多的是對自己知識的歸納整理。若這些東西對你有用,那便是極好的。
HelloWorld
一、前提:已安裝好Jdk(Java Development Kit)。
二、配置環境變量:
新建環境變量JAVA_HOME:F:\JDK (這是我的路徑)
編輯path變量:添加%JAVA_HOME%\bin;
編輯CLASSPATH變量:C:\Users\Administrator\Desktop;
有必要解釋下ClassPath變量,你通過javac編譯出來的.class文件必須放置在ClassPath中任意路徑中,才能運行成功,比如我把Hello.class放在桌面,那么為了運行成功,我就在ClassPath中添加桌面的路徑C:\Users\Administrator\Desktop;否則會出現
錯誤:找不到或無法加載主類
運行cmd
定位到Hello.java所在位置
鍵入javac Hello.java
鍵入 java Hello (注意沒有.class)

public class Hello { public static void main(String[] args) { System.out.println("Hello, world!"); } }
程序入口main函數
必須是public,static,void,String數組參數,缺一不可。
public static void main(String[] args){}
Java的編譯與運行
Java源文件結構
每個Java源文件可以有多個類的定義,但最多只能有一個類是public的,而且該源文件必須以public類的名字命名。
(注:Java中類的定義后面分號不是必須的)

public class Test{} class Sample1{} class Sample2{}
包的引入
假如com.java.school里有一些類,同時還有一個文件夾classes,那么
import com.java.school.*;
只會引入school根目錄下的所有類(*表示所有),而不會引入classes目錄下的類。若還想繼續引用classes下的類,則應當這樣寫。
import com.java.school.*; import com.java.school.classes.*;
編程規范
- 類:所有單詞首字母大寫。如Monkey、SmartMonkey
- 方法和變量:首字母小寫,其余單詞首字母大寫。如add、listAll
- 包:全部小寫。如com.java.school.classes
- 常量:全部大寫,若多個單詞則加下划線隔開。如final String COLOR_OF_MONKET = “red”;
實例變量和靜態變量(類變量)
- 無論你創建了多少實例,類的靜態變量在內存中只有一個,被類的所有實例共享。
- 靜態變量可以通過實例名訪問,也可以通過類名被訪問。
- 每創建一個實例,系統就會為實例變量分配一次內存。
- 實例變量只能通過實例名訪問。
具體看下例子就可以懂了。

public class Person { public int id = 0; //Java支持在聲明時初始化 public static int sum = 0; //Java支持在聲明時初始化 public Person() { id++; sum++; } public static void main(String[] args) { Person p1 = new Person(); Person p2 = new Person(); System.out.println(p1.id); //輸出1 System.out.println(p2.id); //輸出1 System.out.println(Person.sum); //輸出2 靜態變量可以通過類名訪問 } } Person.java
操作符& |
&&和&都是與操作,那么有什么區別呢?

public class Test { public static void main(String[] args) { int a = -1, b = -1; if ((a = 0) == 1 && (b = 1) == 1) {} System.out.println(a); //輸出0賦值成功 System.out.println(b); //輸出-1賦值失敗 a = -1; b = -1; if ((a = 0) == 1 & (b = 1) == 1) {} System.out.println(a); //輸出0賦值成功 System.out.println(b); //輸出1賦值成功 } }
可以看到,當第一條件判斷為false的時候,&&是不會繼續執行、判斷第二個條件的,但&會。|也同理。
==操作符與equals()方法
這個已經被坑過很多很多次了。String的比較全部用equals()不能用==就一定不會錯……
若是基本類型,如int,double,string等等,用==就可以比較相等。
若是引用類型,如String,Integer或自己寫的類等等,用==比較的是是否同一個對象(內存地址是否相同),但我們一般要比價的是內容,所以應該有equals()方法。

public class Test { public static void main(String[] args) { String s1 = "123", s2 = "123"; String s3 = new String("123"), s4 = new String("123"); String s5 = s3; System.out.println(s1 == s2); //true System.out.println(s3 == s4); //false System.out.println(s3 == s5); //true System.out.println(s3.equals(s4)); //true Integer i1 = new Integer(1), i2 = new Integer(1); System.out.println(i1 == i2); //false System.out.println(i1.equals(i2)); //true } }
必要時可以覆蓋equals()方法

public class Student { public String name; public int age; public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Student)) //判斷是否Student的實例 return false; final Student student = (Student)o; //強制類型轉換 return this.name.equals(student.name); } public Student(String name, int age) { this.name = name; this.age = age; } public static void main(String[] args) { Student m1 = new Student("Norcy", 22), m2 = new Student("Fiona", 21), m3 = new Student("Norcy", 23); System.out.println(m1.equals(m2)); //false System.out.println(m1.equals(m3)); //true } }
注意,在重寫equals方法時,要注意滿足離散數學上的特性:
1.自反性:對任意引用值X,x.equals(x)的返回值一定為true
2.對稱性:對於任何引用值x,y,當且僅當y.equals(x)返回值為true時,x.equals(y)的返回值一定為true
3.傳遞性:如果x.equals(y)=true, y.equals(z)=true,則x.equals(z)=true
4.一致性:如果參與比較的對象沒任何改變,則對象比較的結果也不應該有任何改變
5.非空性:任何非空的引用值X,x.equals(null)的返回值一定為false
instanceof操作符
判斷一個對象是否為一個類的實例。
假如s1是Student類的實例,那么對於表達式“s instanceof XXX”,當XXX為以下值的時候,表達式的值為true.
- Student
- Student的直接父類或間接父類(即祖先)
- Student類實現的接口的名字(接口是什么,以后再學)
4種訪問控制級別
public 對外公開
protected 向子類和同一個包中的所有類公開
默認 向同一個包中的所有類公開
private 只有類本身可以訪問,不對外公開
訪問級別:public > protected > default > private
若一個子類與父類在不同包,則這種情況屬於不同包,不屬於子類。
訪問級別 |
同類 |
同包 |
子類 |
不同包 |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
— |
默認 |
√ |
√ |
— |
— |
private |
√ |
— |
— |
— |