Java 開發環境
Java 的特點
面向對象、跨平台、能把中小型程序寫成大型程序
開發 Java 的流程
- 設計類
- 寫代碼
- 重構
Java 程序規范
- Javadoc 風格注釋
- 接口以 able 結尾
- 接口、類使用 Pascal 風格命名
- 成員方法,成員變量使用 camel 風格命名
- 高內聚,低耦合
Java 基本語法
數據類型
基本類型 | 字節個數 | 默認初始值 | 取值范圍 |
---|---|---|---|
byte | 1 | 0 | -128~127 |
short | 2 | 0 | -32769~32767 |
int | 4 | 0 | -2,147,483,648(-2^31)~2,147,485,647(2^31 - 1) |
long | 8 | 0L | -9,223,372,036,854,775,808(-2^63)~9,223,372,036,854,775,807(2^63 -1) |
float | 4 | 0.0f | 符合IEEE 754標准的浮點數 |
double | 8 | 0.0d | 符合IEEE 754標准的浮點數 |
boolean | 1位 | false | true/false |
char | 2 | 必須手動初始化 | '\u0000'~'\uffff' |
8進制與16進制表示
前綴0表示8進制,而前綴0x代表16進制。例如:
int octal = 0144;
int hexa = 0x64;
轉義字符
符號 | 字符含義 |
---|---|
\n | 換行 (0x0a) |
\r | 回車 (0x0d) |
\f | 換頁符(0x0c) |
\b | 退格 (0x08) |
\t | 制表符 |
" | 雙引號 |
' | 單引號 |
\\ | 反斜杠 |
\ddd | 八進制字符 (ddd) |
\uxxxx | 16進制Unicode字符 (xxxx) |
基本類型與引用類型的區別
- 從概念方面來說
基本類型:變量名指向具體的數值
引用類型:變量名指向存數據對象的內存地址 - 從內存構建方面來說
基本類型:基本數據類型在被創建時,在棧上給其划分一塊內存,將數值直接存儲在棧上;
引用類型:引用數據類型在被創建時,首先要在棧上給其引用(句柄)分配一塊內存,而對象的具體信息都存儲在堆內存上,然后由棧上面的引用指向堆中對象的地址。 - 從使用方面來說
基本類型:使用時需要賦具體值,判斷時使用“==”號
引用類型:使用時可以賦null,判斷時使用equals方法
強制類型轉換
(target_type)variable;
關鍵字
關鍵字 | 作用 |
---|---|
break | 用來改變程序執行流程,立刻從當前語句的下一句開始執行從。如果后面跟有一個標簽,則從標簽對應的地方開始執行 |
case | 用來定義一組分支選擇,如果某個值和switch中給出的值一樣,就會從該分支開始執行 |
catch | 用來聲明當try語句塊中發生運行時錯誤或非運行時異常時運行的一個塊 |
continue | 用來打斷當前循環過程,從當前循環的最后重新開始執行,如果后面跟有一個標簽,則從標簽對應的地方開始執行 |
do | 用來聲明一個循環,這個循環的結束條件可以通過while關鍵字設置 |
else | 如果if語句的條件不滿足就會執行該語句 |
final | final 修飾的類不能被繼承。final 修飾的方法不能被子類重寫。final 修飾的變量(成員變量或局部變量)即成為常量,只能賦值一次。final 修飾的成員變量必須在聲明的同時賦值,如果在聲明的時候沒有賦值,那么只有 一次賦值的機會,而且只能在構造方法中顯式賦值,然后才能使用。final 修飾的局部變量可以只聲明不賦值,然后再進行一次性的賦值。 |
finally | 用來執行一段代碼不管在前面定義的try語句中是否有異常或運行時錯誤發生 |
for | 用來聲明一個循環。程序員可以指定要循環的語句,推出條件和初始化變量 |
if | 用來生成一個條件測試,如果條件為真,就執行if下的語句 |
implements | 在類的聲明中是可選的,用來指明當前類實現的接口 |
import | 在源文件的開始部分指明后面將要引用的一個類或整個包,這樣就不必在使用的時候加上包的名字 |
instanceof | 用來測試第一個參數的運行時類型是否和第二個參數兼容 |
interface | 用來定義一系列的方法和常量。它可以被類實現,通過 implements 關鍵字 |
private | 用在方法或變量的聲中。它表示這個方法或變量只能被這個類的其它元素所訪問 |
protected | 在方法和變量的聲明中使用,它表示這個方法或變量只能被同一個類中的,子類中的或者同一個包中的類中的元素所訪問 |
public | 在方法和變量的聲明中使用,它表示這個方法或變量能夠被其它類中的元素訪問 |
return | 用來結束一個方法的執行。它后面可以跟一個方法聲明中要求的值 |
static | 用來定義一個變量為類變量。類只維護一個類變量的拷貝,不管該類當前有多少個實例。 static 同樣能夠用來定義一個方法為類方法。類方法通過類名調用而不是特定的實例,並且只能操作類變量 |
this | 用來代表它出現的類的一個實例。this可以用來訪問類變量和類方法 |
throw | 允許用戶拋出一個exception對象或者任何實現throwable的對象 |
throws | 用在方法的聲明中來說明哪些異常這個方法是不處理的,而是提交到程序的更高一層 |
try | 用來定義一個可能拋出異常語句塊。如果一個異常被拋出,一個可選的catch語句塊會處理try語句塊中拋出的異常。同時,一個finally語句塊會被執行,無論一個異常是否被拋出 |
void | 用在Java語言的方法聲明中說明這個方法沒有任何返回值。"void"也可以用來表示一句沒有任何功能的語句 |
while | 用來定義一段反復執行的循環語句。循環的退出條件是while語句的一部分 |
運算符優先級表
優先級 | 運算符 | 結合性 |
---|---|---|
1 | () [] . | 從左到右 |
2 | ! +(正) -(負) ~ ++ -- | 從右向左 |
3 | * / % | 從左向右 |
4 | +(加) -(減) | 從左向右 |
5 | << >> >>> | 從左向右 |
6 | < <= > >= instanceof | 從左向右 |
7 | == != | 從左向右 |
8 | &(按位與) | 從左向右 |
9 | ^ | 從左向右 |
10 | | | 從左向右 |
11 | && | 從左向右 |
12 | || | 從左向右 |
13 | ?: | 從右向左 |
14 | = += -= *= /= %= &= |= ^= ~= <<= >>= >>>= | 從右向左 |
說明:
- 該表中優先級按照從高到低的順序書寫,也就是優先級為1的優先級最高,優先級14的優先級最低。
- 結合性是指運算符結合的順序,通常都是從左到右。從右向左的運算符最典型的就是負號,例如3+-4,則意義為3加-4,符號首先和運算符右側的內容結合。
- instanceof作用是判斷對象是否為某個類或接口類型
短路原則
-
對於a && b,只有當a和b同時為true時,整個表達式才為true,在java中,首先運算表達式a,如果a為true,則繼續運算表達式b,如果表達式a為false,那么整個表達式也肯定為false,所以表達式b不會被運算。
-
對於a || b,至少有一個為true,則表達式為true,如果a為false,整個表達式的值等於表達式b的值,因此繼續運算表達式b,如果a為true,整個表達式的值為true,則沒有必要再運算表達式b。
數組和字符串
聲明數組變量
double[] array; // 首選的方法
//或
double array[]; // 效果相同,但不是首選方法
數組變量的聲明,和創建數組可以用一條語句完成,如下所示:
// 數組大小
int size = 10;
// 定義數組
double[] myList = new double[size];
//或者
double[] myList = {1.9, 2.9, 3.4, 3.5};
常用屬性
length
, 獲取數組的長度
常用數組方法(在 Arrays
類中 )
方法 | 說明 |
---|---|
public static int binarySearch(Object[] a, Object key) |
用二分查找算法在給定數組中搜索給定值的對象(Byte,Int,double等)。數組在調用前必須排序好的。如果查找值包含在數組中,則返回搜索鍵的索引;否則返回 (-(插入點) - 1)。 |
public static boolean equals(long[] a, long[] a2) |
如果兩個指定的 long 型數組彼此相等,則返回 true 。如果兩個數組包含相同數量的元素,並且兩個數組中的所有相應元素對都是相等的,則認為這兩個數組是相等的。換句話說,如果兩個數組以相同順序包含相同的元素,則兩個數組是相等的。同樣的方法適用於所有的其他基本數據類型(Byte ,short ,int 等)。 |
public static void fill(int[] a, int val) |
將指定的 int 值分配給指定 int 型數組指定范圍中的每個元素。同樣的方法適用於所有的其他基本數據類型(byte ,short ,int 等)。 |
public static void sort(Object[] a) |
對指定對象數組根據其元素的自然順序進行升序排列。同樣的方法適用於所有的其他基本數據類型(byte ,short ,int 等)。 |
遍歷數組
for (double item:arrays)
{
//do something here
}
String
類的常用方法
方法 | 作用 |
---|---|
int length() |
返回字符串對象包含的字符數 |
String format() |
創建格式化字符串 |
int charAt(int index) |
返回指定索引處的 char 值 |
int compareTo(String anotherString) |
按字典順序比較兩個字符串 |
int compareToIgnoreCase(String str) |
按字典順序比較兩個字符串,不考慮大小寫 |
boolean endsWith(String suffix) |
測試此字符串是否以指定的后綴結束 |
boolean equalsIgnoreCase(String anotherString) |
將此 String 與另一個 String 比較,不考慮大小寫 |
boolean equals(String anotherString) |
將此 String 與另一個 String 比較 |
String replace(char oldChar, char newChar) |
返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 得到的 |
boolean startsWith(String prefix) |
測試此字符串是否以指定的前綴開始 |
String toLowerCase() |
使用默認語言環境的規則將此 String 中的所有字符都轉換為小寫 |
String toUpperCase() |
使用默認語言環境的規則將此 String 中的所有字符都轉換為大寫 |
String trim() |
返回字符串的副本,忽略前導空白和尾部空白 |
String
類的 ==
判斷的是變量是否引用的同一個實例,而不是他們所引用的實例的內容是否相等
Java 面向對象基礎
基本概念:
- 成員變量
- 成員方法
- 創建對象的關鍵字
new
- 構造函數的定義:無返回值,與類同名
this
表示當前實例,super
表示父類- 當使用
super(someargs)
來繼承父類的構造函數的時候,這句話必須放在最前面 this(someargs)
表示調用此類中與參數相符的構造函數重載,也必須放在構造函數的最前面- 上面兩個語句不能出現在同一個構造函數中
- 本質上來說,
this
是一個指向當前對象的指針,super
是一個關鍵字
- 當使用
static
關鍵字修飾的成員變量和成員方法獨立於該類的任何對象。也就是說,它不依賴類特定的實例,被類的所有實例共享。final
關鍵字有一下幾種含義:- 一個編譯時恆定不變的常量
- 一個在運行時初始化,而你不希望它被改變的變量
- 參數列表中的參數以聲明的方式聲指明為final,這意味着你無法改變參數所指向的對象
- 把方法鎖定,以防止任何繼承它的類修改它的含義
類的繼承
// A.java
public class A {
private int i;
protected int j;
public void func() {
}
}
// B.java
public class B extends A {
}
- 類只能有一個爸爸(父類),但可以實現多個接口
- 子類可以繼承父類所有的方法和屬性,但是無法使用
private
(私有) 的方法和屬性 - 通過使用
instanceof
操作符,能夠確定對象是否是一個類或者其子類的實例 - 繼承基本類和抽象類用
extends
關鍵字,實現接口類的繼承用implements
關鍵字。
重寫與重載
重寫
重寫是子類對父類的允許訪問的方法的實現過程進行重新編寫!返回值和形參都不能改變。即外殼不變,核心重寫!
方法的重寫規則
- 參數列表必須完全與被重寫方法的相同;
- 返回類型必須完全與被重寫方法的返回類型相同;
- 訪問權限不能比父類中被重寫的方法的訪問權限更高。例如:如果父類的一個方法被聲明為
public
,那么在子類中重寫該方法就不能聲明為protected
。 - 父類的成員方法只能被它的子類重寫。
- 聲明為final的方法不能被重寫。
- 聲明為static的方法不能被重寫,但是能夠被再次聲明。
- 子類和父類在同一個包中,那么子類可以重寫父類所有方法,除了聲明為
private
和final
的方法。 - 子類和父類不在同一個包中,那么子類只能夠重寫父類的聲明為
public
和protected
的非final
方法。 - 重寫的方法能夠拋出任何非強制異常,無論被重寫的方法是否拋出異常。但是,重寫的方法不能拋出新的強制性異常,或者比被重寫方法聲明的更廣泛的強制性異常,反之則可以。
- 構造方法不能被重寫。
- 如果不能繼承一個方法,則不能重寫這個方法。
重載
重載(overloading) 是在一個類里面,方法名字相同,而參數不同。返回類型呢?可以相同也可以不同。
重載規則
- 被重載的方法必須改變參數列表;
- 被重載的方法可以改變返回類型;
- 被重載的方法可以改變訪問修飾符;
- 被重載的方法可以聲明新的或更廣的檢查異常;
- 方法能夠在同一個類中或者在一個子類中被重載。
重寫與重載的區別
區別點 | 重載方法 | 重寫方法 |
---|---|---|
參數列表 | 必須修改 | 一定不能修改 |
返回類型 | 可以修改 | 一定不能修改 |
異常 | 可以修改 | 可以減少或刪除,一定不能拋出新的或者更廣的異常 |
訪問 | 可以修改 | 一定不能做更嚴格的限制(可以降低限制) |
多態性
多態是同一個行為具有多個不同表現形式或形態的能力。
多態存在的三個必要條件:
- 繼承
- 重寫
- 父類引用指向子類對象
Java 包(package)
包的作用
- 把功能相似或相關的類或接口組織在同一個包中,方便類的查找和使用。
- 如同文件夾一樣,包也采用了樹形目錄的存儲方式。同一個包中的類名字是不同的,不同的包中的類的名字是可以相同的,當同時調用兩個不同包中相同類名的類時,應該加上包名加以區別。因此,包可以避免名字沖突。
- 包也限定了訪問權限,擁有包訪問權限的類才能訪問某個包中的類。
默認導入的包是java.lang
抽象方法:
public abstract <returnType> <methodName>(...);
僅有方法頭,而沒有方法體和操作實現,具體實現由當前類的不同子類在它們各自的類聲明中完成,抽象類可以包含抽象方法
注意
- 一個抽象類的子類如果不是抽象類,則它必須為父類中的所有抽象方法書寫方法體,即重寫父類中的所有抽象方法
- 只有抽象類才能具有抽象方法,即如果一個類中含有抽象方法,則必須將這個類聲明為抽象類
- 除了抽象方法,抽象類中還可以包括非抽象方法
抽象類
abstract class Number
{
//. . .
}
- 沒有具體實例對象的類,不能使用
new
方法進行實例化 - 類前需加修飾符
abstract
- 可包含常規類能夠包含的任何東西,例如構造方法,非抽象方法
- 也可包含抽象方法,這種方法只有方法的聲明,而沒有方法的實現
集合類
Set
- 集合中的對象不按特定的方式排序,並且沒有重復對象。
- 實現:
- HashSet: HashSet類按照哈希算法來存取集合中的對象,存取速度比較快
- TreeSet :TreeSet類實現了SortedSet接口,能夠對集合中的對象進行排序
List
- 元素以線性方式存儲,集合中可以存放重復對象。
- 實現:
- ArrayList : 代表長度可以改變的數組。可以對元素進行隨機的訪問,向ArrayList()中插入與刪除元素的速度慢
- LinkedList : 在實現中采用鏈表數據結構。插入和刪除速度快,訪問速度慢。
Map
一種把鍵對象和值對象映射的集合,它的每一個元素都包含一對鍵對象和值對象
常用操作:
Object put(Object key, Object value) //向集合中加入元素
Object remove(Object key) //刪除與KEY相關的元素
void putAll(Map t) //將來自特定映像的所有元素添加給該映像
void clear() //從映像中刪除所有映射
Object get(Object key) //獲得與關鍵字key相關的值
put(Object key, Object value) //添加一個“值”(想要得東西)和與“值”相關聯的“鍵”(key)(使用它來查找)
數組、List相互轉換
//List to array
Employee[] employees = employeeList.toArray(new Employee[employeeList.size()]);
//Array to list
employeeList = Arrays.asList(employees);
常用集合操作
//遍歷
employeeList
.stream()
.forEach(employee ->
{
//Do something here
}));
//去重
employeeList = employeeList
.stream()
.distinct() //使用 equals()方法
.collect(Collectors.toList());
//字符串列表轉小寫並去重
list = list
.stream()
.map(s->s.toLowerCase()+"或者你也可以在這里加上自己喜歡的話")
.distinct()
.collect(Collectors.toList()); //list 必須是 List 接口類型變量
//或者我們還可以排個序
list.sort((s1,s2)->
{
//或者在這里寫你自己的比較方法
//返回類型是 int
return s1.compareTo(s2);
});
//最后我們還可以刪庫跑路
list.clear();
IO 操作
常用的讀寫文件的操作
//從控制台讀入
//先背一波類名
BufferedReader brConsole = new BufferedReader(new InputStreamReader(System.in));
try
{
//讀取文件
BufferedWriter bwFile = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("worldcup.txt",true)));
String line = null;
while((line=brConsole.readLine())!=null)
{
if ("Done".equalsIgnoreCase(line))
{
break;
}
else
{
bwFile.write(line);
bwFile.newLine();
}
}
bwFile.flush();
//好煩啊,其他的都差不多了,不寫了
自定義異常
聲明一個異常
class MyException extends Exception
{
}
捕獲異常
try
{
// 程序代碼
}
catch(ExceptionName e1)
{
//Catch 塊
}
捕獲多重異常
try
{
// 程序代碼
}
catch(異常類型1 異常的變量名1)
{
// 程序代碼
}
catch(異常類型2 異常的變量名2)
{
// 程序代碼
}
catch(異常類型3 異常的變量名3)
{
// 程序代碼
}
//或者
try
{
// 程序代碼
}
catch(異常類型1 | 異常類型2 | 異常類型3 異常的變量名)
{
// 程序代碼
}
參考:
Java 教程 | 菜鳥教程:http://www.runoob.com/java/java-tutorial.html