1. 程式人生 > >Java類基礎知識

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
          }
    }
    
  • 一個類中的方法可以相互呼叫,例項方法可以呼叫該類中的其他方法;類中的類方法只能呼叫該類的類方法,不能呼叫例項方法。