Java類基礎知識
面嚮物件語言特性
眾所周知,Java是一門面向物件的程式語言,它的源程式由若干個類組成,原始檔時拓展名為.java的文字檔案。下面給出面向物件程式設計的特性:
- 1.封裝性。即將資料和對資料的操作封裝在一起,通過抽象,從具體的例項中抽取共同的性質形成一般的概念。比如類的概念。
- 2.繼承性。子類可以繼承父類的屬性和功能,既繼承了父類所有的資料和資料上的操作,同時又可以新增子類獨有的資料和資料上的操作。
- 3.多型性。一種是操作名稱的多型,既有多個操作具有相同的名字,但這些操作所接受的資訊型別必須不同。另一種多型是和繼承有關的多型,是指同一個操作被不同的型別物件呼叫時可能產生不同的行為。
類的宣告
類是組成Java程 序的基本要素,類封裝了一類物件的狀態與方法,類是用來定義物件的模板。類的實現包括兩個部分,即類的宣告和類體,基本格式如下:
class 類名{ //類的宣告
類體的內容 //類體
}
類的宣告注意事項 : 1.類的名字要符合識別符號的規定。(語法要求) 2.如果類名使用拉丁字母,那麼類名的首字母使用大寫字母。(不是語法要求但需要遵守) 3.類名最好容易識別,見名知意。(不是語法要求但需要遵守)
類體說明 : 1.類聲明後的一對大括號{ }以及它們之間的內容成為類體,大括號之間的內容稱為類體的內容。 2.類體由兩個部分構成:一部分是變數的宣告,用來刻畫屬性;另一部分是方法的定義
class Trapezoid{
float 上底,下底,高,laderArea; //變數宣告,刻畫屬性
float 計算面積(){ //方法定義,刻畫功能
laderArea = (上底+下底)*高/2.0f;
}
void 修改高(float h){
高 = h;
}
}
成員變數和區域性變數
變數的有效範圍
在變數宣告部分宣告的變數被稱為類的成員變數,在方法體中宣告的變數和方法的引數被稱為區域性變數。當然,成員變數和區域性變數的型別可以時Java中的任何一種資料型別。
- 成員變數在整個類內都有效,區域性變數只在宣告它的方法內有效。
- 方法引數在整個方法內有效,方法內的區域性變數從宣告他的位置之後開始有效。
- 如果區域性變數的宣告是在一個複合語句中,那麼該有效範圍的有效範圍就是該複合語句,即僅在該複合語句中有效。
- 如果區域性變數的宣告是在一個迴圈語句中,那麼該區域性變數的有效範圍是該迴圈語句,即僅在迴圈語句中有效。 舉個栗子:
public class A{
int m = 10,sum = 0; //成員變數,在整個類中有效
void f(){
if(m>9){
int z = 10; //z僅僅在該複合語句中有效
z = 2*m + z;
}
for(int i = 0;i<m;++i){
sum += i; //i僅在該迴圈語句中有效
}
}
}
例項變數與類變數
在宣告成員變數前,用關鍵詞static給予修飾的稱作類變數(靜態變數),否則稱之為例項變數(物件變數)。 類變數是所有物件共有,其中一個物件將它的值改變,其他物件得到的就是改變後的結果;而例項變數則屬於物件私有,某一個物件將其值改變,不影響其他物件。 舉個栗子:
class Dog{
float x = 0; //例項變數
static int y = 0; //類變數(靜態變數)
}
public class A{
public static void main(String[] args){
Dog a1 = new Dog();
Dog a2 = new Dog();
a1.x = 3.0f;
a1.y = 4; //等同於 Dog.y = 4;
System.out.println(a2.y); //結果為4
System.out.println(a2.x); //結果為0
}
}
成員的隱藏
如果區域性變數的名字與成員變數的名字相同,則成員變數被隱藏,即這個成員變數在這個方法內失效。例如:
class Tom{
int x = 99,y;
void f(){
int x = 3;
y = x; //y得到的值為3,而不是99
}
}
如果仍希望在該方法中使用隱藏的成員變數,需要用到關鍵詞this,比如這樣:
class Tom{
int x = 99,y;
void f(){
int x = 3;
y = this.x; //y得到的值為99,而不是3
}
}
變數書寫風格
雖然其中的一些要求不是語法要求,但是還是希望大家能夠遵守,養成良好的變成習慣。
- 一行只宣告一個變數(便於給程式碼添加註釋)。
- 變數的名字符合識別符號的規定。
- 變數的名字見名知意,避免容易混淆的變數的名字,也儘量不要用a1,a2這種方式。
方法
最基本的方法包括方法名和方法的返回型別,並且很多方法宣告中都給出了方法的引數,例如:
float area(int a,float b,...){//引數可以省略,根據需要填寫
...//方法體
}
方法的引數和返回型別可以是任意的Java資料型別,不需要返回型別時要用void。方法宣告之後的一對大括號"{"、"}"以及之間的內容稱為方法體。方法體內包括區域性變數的宣告和Java語句。寫一個方法完全類似於C++裡面的函式,只不過是面嚮物件語言中的稱呼。
方法過載
前面說過,Java中存在兩種多型,即過載和重寫,重寫是和繼承有關的多型,將在以後的部落格中討論。 方法過載是多型性的一種,所謂功能多型性,是指可以向功能傳遞不同的訊息,以便讓物件根據相應的訊息產生相應的行為。方法過載的意思是,一個類中可以有多個方法具有相同的名字,但這些方法的引數必須不同(1.引數個數不同 2.引數型別不同)。 舉個栗子:
class Lin{
float getArea(float r){
return 3.14f*r*r;
}
double getArea(float x,float y){
return x*y;
}
float getArea(int x,float y){
return x*y;
}
double getArea(float x,float y,float z){
return (x*x+y*y+z*z)*2.0;
}
}
Notice: 方法的返回型別和引數的名字不參與比較,所以說,方法過載需要保證引數個數或者引數型別的不同!!!
構造方法
和C++相同,當我們建立一個物件時,會呼叫構造方法進行初始化。構造方法也是一種特殊的方法, 它的名字必須與它所在類的名字完全相同 ,不需要寫型別,也可以過載。 舉個栗子:
class Trapezoid{
float 上底,下底,高;
Trapzoid(){ //構造方法
上底 = 60;
下底 = 100;
高 = 20;
}
Trapzoid(float x,int y,float z){ //構造方法
上底 = x;
下底 = y;
高 = z;
}
}
例項方法與類方法
和例項變數和類變數一樣,類中的方法也分為例項方法和類方法。在宣告方法時,方法型別前面不加關鍵字static修飾的是例項方法,加static的是類方法(靜態方法)。 舉個例子:
class A{
int a;
float b(int x,float y){ //例項方法
}
static void speak(String s){ //類方法
}
}
Notice:
-
對成員變數的操作只能放在方法中,方法可以對成員變數和該方法體中宣告的區域性變數進行操作。當然,在宣告類的成員變數時可以同時賦予初值。
-
例項方法既能對類變數操作也能對例項變數進行操作,而類方法只能對類變數進行操作。
class A{ int a; //例項變數 static int b; //類變數 void f(int x,int y){ //例項方法 a = x; //true b = y; //true } static void g(int z){ b = 23; //true a = z; //False } }
-
一個類中的方法可以相互呼叫,例項方法可以呼叫該類中的其他方法;類中的類方法只能呼叫該類的類方法,不能呼叫例項方法。