1. 程式人生 > >Java之路:類的宣告與定義

Java之路:類的宣告與定義

一、類的宣告

在使用類之前,必須先宣告它,然後才可以宣告變數,並建立物件。

類宣告的語法如下:

[識別符號] class 類名稱
  {
      //類的成員變數
      //類的方法
  }

在上面的語法格式中,[識別符號] 可以是publicprivateprotected或者完全省略這個修飾符。

類名稱遵循識別符號命名規則與規範,這裡不再贅述,有興趣的可以去識別符號命名規則與規範看看。

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類的成員方法沒有機會被覆蓋,預設情況下類都是default的

在設計類時候,如果這個類不需要有子類,類的實現細節不允許改變,並且確信這個類不會再被擴充套件,那麼就設計為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修飾的方法也稱為類方法。