概要:java是一種強型別語言,必須爲每一個變數宣告一種型別
整形
注意事項
浮點型
char型別
boolean型別
static final
進行修飾
public static final double PI=3.14
塊控制域:塊(即複合語句)是指由一對大括號括起來的若幹條簡單的 Java 語句。塊確定了變數的作用域。不能在巢狀的兩個塊中宣告同名的變數。
條件語句:if (condition) statement
回圈
確定回圈
多重選擇:switch語句
switch(choice){
case 1:--- break;
case 2:---break;
default:-----break;
}
中斷控制流程語句
goto作爲保留,但實際上並沒有打算在語言裡使用它
java中帶標籤的break
label:
{
if (condition) break label ] // exits block
}
…
continue跳過本次回圈
陣列宣告,初始化,初始化匿名陣列
int [] a; //這條語句只宣告瞭變數 a,並沒有將 a 初始化爲一個真正的陣列,應該使用 new 運算子建立陣列。
int [] a=new int [100]; //這條語句建立了一個可以儲存 100 個整數的陣列。陣列長度不要求是常數:newint[n] 會建立一個長度爲 n 的陣列。
**警告**: 如果建立了一個 100 個元素的陣列, 並且試圖存取元素 a[100] (或任何在 0 ~ 99之外的下標,) 程式就會引發「 array index out of bounds」 異常而終止執行。
int[] small Primes = { 2, 3, 5, 7, 11, 13 }; //在 Java中, 提供了一種建立陣列物件並同時賦予初始值的簡化書寫形式。
new intD { 17, 19, 23, 29, 31, 37 } //初始化匿名陣列
small Primes = new int[] { 17, 19, 23, 29, 31, 37 }; //使用這種語法形式可以在不建立新變數的情況下重新初始化一個數組
for each回圈
for (int element : a)
System.out.println(element)
陣列拷貝
//允許將一個數組變數拷貝給另一個數組變數。這時, 兩個變數將參照同一個陣列:
intQ luckyNumbers = smallPrimes;
1uckyNumbers[S] = 12; // now smallPrimes[5] is also 12
//如果希望將一個數組的所有值拷貝到一個新的陣列中去,就要使用 Arrays 類的 copyOf方法:
int[] copiedLuckyNumbers = Arrays.copyOf(luckyNumbers , luckyNumbers.length);
陣列排序
int [] a=new int[10000];
Arrays.sort(a)
多維陣列
//在 Java 中,宣告一個二維陣列相當簡單
double [][] balances;
//與一維陣列一樣,在呼叫new對多維陣列進行初始化之前不能使用它
balances=new double[NYEARS][NRATES];
//如果知道陣列元素, 就可以不呼叫 new, 而直接使用簡化的書寫形式對多維陣列進行初始化
int[][] magicSquare =
{
{16, 3, 2, 13},
{5, 10, 11, 8},
(9, 6, 7, 12},
{4, 15, 14, 1}
};
//for each處理二維陣列
for (doubleG row : a)
for (double value : row)
do something with value
//快速列印二維陣列的數據列表
System.out.println(Arrays.deepToString(a));
物件的三個主要特性:
構造物件
//構造器的名字應該與類名相同。因此 Date 類的構造器名爲 Date。要想構造一個 Date 物件, 需要在構造器前面加上 new 操作符,
new Date()
物件變數和物件
//定義了一個物件變數 deadline, 它 可 以 引 用 Date 型別的物件。但是,一定要認識到: 變數deadline 不是一個物件, 實際上也沒有參照物件。此時,不能將任何 Date 方法應用於這個變數上
s = deadline.toStringO; // not yet
//必須首先初始化變數 deadline,可以用新構造的物件初始化這個變數:
deadline = new Date();
//這個變數參照一個已存在的物件
deadline = birthday;
//在 Java 中,任何物件變數的值都是對儲存在另外一個地方的一個物件的參照。
Date deadline = new Date(); //表達式 new Date() 構造了一個 Date 型別的物件,並且它的值是對新建立物件的參照。這個參照儲存在變數deadline中。
//可以顯式地將物件變數設定爲null,表明這個物件變數目前沒有參照任何物件。
deadline = null;
if (deadline != null)
System.out.println(deadline);
如果將一個方法應用於一個值爲 null 的物件上,那麼就會產生執行時錯誤。
birthday = null;
String s = birthday.toStringQ; // runtime error!
//區域性變數不會自動地初始化爲 null,而必須通過呼叫new或將它們設定爲null進行初始化
構造器
隱式參數和顯式參數
//第一個參數稱爲隱式 ( implicit ) 參數, 是出現在方法名前的 Employee 類物件。第二個參數位於方法名後面括號中的數值,這是一個顯式 ( explicit) 參數
number007. raiseSalary(5);
public void raiseSalary(double byPercent){
double raise = salary * byPercent / 100;
salary += raise;
}
final範例域
final 修飾符大都應用於基本 (primitive ) 型別域,或不可變(immutable) 類的域(如果類 中的每個方法都不會改變其物件, 這種類就是不可變的類。例如,String類就是一個不可變的類)
//對於可變的類, 使用 final 修飾符可能會對讀者造成混亂。例如,
private final StringBuiIcier evaluations;
//在 Employee 構造器中會初始化爲
evaluations = new StringBuilder();
//final 關鍵字只是表示儲存在 evaluations 變數中的物件參照不會再指示其他 StringBuilder物件。不過這個物件可以更改:
public void giveGoldStarO{
evaluations.append(LocalDate.now() + ": Gold star!\n");
}
靜態域與靜態方法
靜態域
//現在, 每一個僱員物件都有一個自己的 id 域, 但這個類的所有範例將共用一個 iiextld域。換句話說, 如果有 1000 個 Employee 類的物件, 則有 1000 個範例域 id。但是, 只有一個靜態域 nextld。即使沒有一個僱員物件, 靜態域 nextld 也存在。它屬於類,而不屬於任何獨立的物件
class Employee{
private static int nextld = 1;
private int id;
}
靜態常數
//如果關鍵字 static 被省略, PI 就變成了 Math 類的一個範例域。需要通過 Math 類的物件存取 PI,並且每一個 Math 物件都有它自己的一份 PI 拷貝。
public class Hath{
public static final double PI = 3.14159265358979323846;
}
靜態方法
//靜態方法是一種不能向物件實施操作的方法。例如, Math 類的 pow 方法就是一靜態方法。可以認爲靜態方法是有this參數的方法
Math.pow(x, a)
使用靜態方法的情況
**一個方法不需要存取物件狀態,其所需參數都是通過顯式參數提供(例如:Math.pow)**
Employee中的靜態方法不能存取Id 範例域, 因爲它不能操作物件。但是靜態方法可以存取自身類中的靜態域
**一個方法只需要存取類的靜態域(例如:Employee.getNextld)**
工廠方法
//靜態方法還有另外一種常見的用途。類似 LocalDate 和 NumberFormat 的類使用靜態工廠方法 (factory method)來構造物件
NumberFormat currencyFormatter = NumberFormat.getCurrencylnstanceO;
NumberFormat percentFormatter = NumberFormat.getPercentlnstance();
double x = 0.1;
System.out.println(currencyFormatter.format(x)); // prints $O.10
System.out.println(percentFomatter.format(x)); // prints 10%
方法參數
//首先回顧一下在程式設計語言中有關將參數傳遞給方法(或函數)的一些專業術語。按值呼叫 (call by value) 表示方法接收的是呼叫者提供的值。而按參照呼叫 ( call by reference)表示方法接收的是呼叫者提供的變數地址。
//Java總是按值呼叫
C++,Pascal提供了兩種參數傳遞的方式
物件構造
過載
//有些類有多個構造器。例如, 可以如下構造一個空的 StringBuilder 物件:
StringBuilder messages = new StringBuilder();
//或者, 可以指定一個初始字串:
StringBuilder todoList = new StringBuilder('To do:\n");
//這種特徵叫做過載( overloading。) 如果多個方法(比如, StringBuilder 構造器方法)有相同的名字、 不同的參數,便產生了過載。編譯器必須挑選出具體執行哪個方法,它通過用各個方法給出的參數型別與特定方法呼叫所使用的值型別進行匹配來挑選出相應的方法。如果編譯器找不到匹配的參數, 就會產生編譯時錯誤,因爲根本不存在匹配, 或者沒有一個比其他的更好。(這個過程被稱爲過載解析(overloading resolution)。)
要完整地描述一個方法, 需要指出方法名以及參數型別。這叫做方法的簽名(signature)
indexOf(int)
indexOf(int, int)
indexOf(String)
indexOf(String, int)
//返回型別不是方法簽名的一部分。也就是說, 不能有兩個名字相同、 參數型別也相同卻返回不同類型值的方法。
預設域初始化
如果在構造器中沒有顯式地給域賦予初值,那麼就會被自動地賦爲預設值: 數值爲 0、 布爾值爲 false、 物件參照爲 null。然而,只有缺少程式設計經驗的人纔會這樣做。確實, 如 果不明確地對域進行初始化,就會影響程式程式碼的可讀性。
無參數的構造器
//很多類都包含一個無參數的建構函式,物件由無參數建構函式建立時, 其狀態會設定爲適當的預設值。
public Employee0
{
name =""
salary = 0;
hireDay = LocalDate,now();
}
如果在編寫一個類時沒有編寫構造器, 那麼系統就會提供一個無參數構造器。這個構造 器將所有的範例域設定爲預設值。於是, 範例域中的數值型數據設定爲 0、 布爾型數據設定 爲 false、 所有物件變數將設定爲 null。 如果類中提供了至少一個構造器, 但是沒有提供無參數的構造器, 則在構造物件時如果 沒有提供參數就會被視爲不合法。
顯示域初始化
//通過過載類的構造器方法,可以採用多種形式設定類的範例域的初始狀態。確保不管怎樣呼叫構造器,每個範例域都可以被設定爲一個有意義的初值,這是一種很好的設計習慣。
參數
呼叫另外一個構造器
初始化數據域的方法
在構造器中設定值
在宣告中賦值
初始化塊
由於初始化數據域有多種途徑,所以列出構造過程的所有路徑可能相當混亂。下面 下麪是調 用構造器的具體處理步驟:
物件解構與 finalize 方法
包
類路徑
文件註釋