Java之路:類的宣告與定義
一、類的宣告
在使用類之前,必須先宣告它,然後才可以宣告變數,並建立物件。
類宣告的語法如下:
[識別符號] class 類名稱
{
//類的成員變數
//類的方法
}
在上面的語法格式中,[識別符號] 可以是public、private、protected或者完全省略這個修飾符。
類名稱遵循識別符號命名規則與規範,這裡不再贅述,有興趣的可以去識別符號命名規則與規範看看。
Java提供了一系列的訪問控制符來設定基於類(class)、變數(variable)、方法(method)及構造方法(constructor)等不同等級的訪問許可權。
Java的訪問許可權主要有4類:
1、default(預設)
在預設模式下,不需為某個類、方法等不加任何訪問修飾符。這類方式宣告的方法和類,只允許在同一個包(package)內是可訪問的。
2、 private(私有)
這是Java語言中對訪問許可權控制最嚴格的修飾符。如果一個方法、變數和構造方法被宣告為“私有”訪問,那麼它僅能在當前宣告它的類內部訪問。
類和介面(interface)的訪問方式是不能被宣告為私有的。
3、public(公有)
這是Java語言中訪問許可權控制最寬鬆的修飾符。如果一個類、方法、構造方法和介面等被宣告為“公有”訪問,那麼它不僅可以被跨類訪問,而且允許跨包訪問。
如果需要訪問其他包裡的公有成員,則需要事先匯入(import)那個包含所需公有類、變數和方法等的那個包。
4、protected(保護)
介於public 和 private 之間的一種訪問修飾符。如果一個變數、方法和構造方法在父類中被宣告為“保護”訪問型別,只能被類本身的方法及子類訪問,即使子類在不同的包中也可以訪問。
類和介面(interface)的訪問方式是不能宣告為保護型別的。
5、final
類的識別符號除了上述的4個訪問控制符,還可以是final。
關鍵字“final”有“無法改變的”或者“終態的”含義。
一個類一旦被宣告為final,那這個final類不能被繼承
在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會再被擴充套件,那麼就設計為final類。
【示例】
class Person
{
String name;
int age;
void talk()
{
System.out.println("我是:"+name+",今年:"+age+"歲");
}
}
二、類的定義
在宣告一個類後,還需要對類進行定義。
構造方法(constructor,又稱構造器或建構函式)、屬性和方法是三種最常見的成員
定義類的語法如下:
class 類名稱
{
// 定義屬性
資料型別 屬性; //零到多個屬性
// 定義建構函式
類名稱(引數,…) //零個到多個構造方法
{
}
// 定義方法
返回值的資料型別 方法名稱(引數1,引數2…) //零到多個方法
{
程式語句 ;
return 表示式 ;
}
}
類中各個成員之間,定義的先後順序沒有任何影響。
各成員可相互呼叫,但值得注意的是,static修飾的成員不能訪問沒有static修飾的成員。
public class Static {
private int i;
public static void f() {
i++; // 錯誤,靜態方法 f() 無法訪問非靜態屬性 i
}
}
屬性用於定義該類或該類的例項所包含的各種資料。方法則用於定義類中的行為特徵或功能實現(即對資料的各種操作)。構造方法是一種特殊的方法,專用於構造該類的例項(如例項的初始化、分配例項記憶體空間等),Java語言通過new關鍵字來呼叫構造方法,從而返回該類的例項。
定義一個類後,就可以建立類的例項了,建立類例項通過new關鍵字完成。如下:
public class Static {
private int i; // 屬性
public Static() {} // 構造方法
public void f() { //普通方法
i++;
}
public static void main(String[] args) {
Static s = new Static(); // 生成Static類的例項s
System.out.println(s.i);
s.f(); // 呼叫f()方法,i++
System.out.println(s.i);
}
}
【結果】
三、類的屬性
類的基本組成部分包括屬性和方法。
類的屬性也稱為欄位、域或成員變數,不過習慣上將它稱為屬性。
類的屬性是變數。定義屬性的語法如下:
[修飾符] 屬性型別 屬性名 [=預設值];
private int age [= 30];
屬性語法格式的詳細說明如下。
1、修飾符
修飾符可省略(省略,即為預設default),也可是訪問控制符public、protected、private及static、final。
其中三個訪問控制符public、protected和private只能使用其中之一, static和final則可組合起來修飾屬性。
2、屬性型別
屬性型別可以是Java允許的任何資料型別,包括基本型別(int、float等)和引用型別(類、陣列、介面等)。
3、屬性名
屬性名遵循識別符號命名規則與規範,這裡不再贅述,有興趣的可以去識別符號命名規則與規範看看。
4、預設值
定義屬性還可以定義一個可選的預設值。
下面通過一個例子來看下屬性的使用:
public class usingAttribute {
/* 定義兩個靜態String屬性
* 由於它們是靜態的,所以它們是屬於類的,
* 也就是這個類定義的所有物件共有的,
* 所有的物件看到的靜態屬性值都是相同的
*/
static String a="string-a";
static String b;
/* 定義兩個非靜態的String屬性,
* 由於是非靜態的,所以它們是屬於這個類所定義的物件私有的,
* 每個物件都有這個屬性,且它們各自的屬性值可不同
*/
String c="stirng-c";
String d;
/* 使用static + {} 括起來的程式碼稱為靜態程式碼塊,
* static語句塊用於初始化static成員變數,是最先執行的語句塊
* 在此用來初始化靜態變數b
*/
static
{
System.out.println("static語句塊開始執行!");
printStatic("before static");
b="string-b";
printStatic("after static");
}
/* 定義一個構造方法,並用來初始化非靜態屬性d
* 構造方法的主要目的是建立物件
*/
public usingAttribute() {
System.out.println("構造方法開始執行!");
print("before constructor");
d="string-d";
print("after constructor");
}
/* 定義一個靜態方法
* 輸出靜態成員變數
*/
public static void printStatic(String title) {
System.out.println("---------"+title+"---------");
System.out.println("a=\""+a+"\"");
System.out.println("b=\""+b+"\"");
}
/* 定義一個普通公有的方法
* 列印所有屬性,包括靜態成員
*/
public void print(String title) {
System.out.println("---------"+title+"---------");
System.out.println("a=\""+a+"\"");
System.out.println("b=\""+b+"\"");
System.out.println("c=\""+c+"\"");
System.out.println("d=\""+d+"\"");
}
// 方法main()
public static void main(String[]args) {
System.out.println();
System.out.println("---------建立usingAttribute物件---------");
System.out.println();
new usingAttribute();
}
}
【結果】
【結果分析】
由輸出結果可以看出,Java類屬性和物件屬性的初始化順序如下:
⑴ 類屬性 (靜態變數)定義時的初始化,如範例中的 static String a = “string-a”。
⑵ static 塊中的初始化程式碼,如範例中的 static {} 中的 b = “string-b”。
⑶ 物件屬性 (非靜態變數) 定義時的初始化,如範例中的 String c = “stirng-c”。
⑷ 構造方法 (函式) 中的初始化程式碼,如範例構造方法中的 d = “string-d”。
當然這裡只是為了演示Java類的屬性和物件屬性的初始化順序。在實際的應用中,並不建議在類中定義屬性時實施初始化,如例子中的字串變數“a”和“c”。
注:被static修飾的變數稱為類變數(class’s variables),它們被類的例項所共享。也就是說,某一個類的例項改變了這個靜態值,其他這個類的例項也會受到影響。而成員變數(member variable)則是沒有被static修飾的變數,為例項所私有,也就是說,每個類的例項都有一份自己專屬的成員變數,只有當前例項才可更改它們的值。
static是一個特殊的關鍵字,它不僅用於修飾屬性(變數),成員,還可用於修飾類中的方法。被static修飾的方法,同樣表明它是屬於這個類共有的,而不是屬於該類的單個例項,通常把static修飾的方法也稱為類方法。