Java中類的聲明與對象創建


  類是一個模板,它描述一類對象的行為和狀態;對象是類的一個具體的實例,由類構造對象的過程稱為創建類的實例。如:路燈是一個類,每一個路燈就是該類的對象。

1.類聲明

  類聲明格式

[public] [abstract|final] class 類名稱        //class表明其后聲明的是一個類,final表示該類為終結類,不能被繼承;abstract為抽象類
[extends 父類名稱]                               //表示該類繼承的父類
[implements 接口名稱列表]{                  //表明該類要實現的接口
       數據成員聲明及初始化;
       方法聲明及方法體;     
}

例:鍾表類實例

public class Clock{
	//變量成員
	int hour;
	int minute;
	int second;
	
	//方法成員
	public void setTime(int newH,int newM,int newS){
		hour = newH;
		minute = newM;
		second = news;
	}
	
	public void showTime(){
		System.out.println(hour + ":" + minute + ":" + second);
	}
}

 

2.對象創建

  對象在使用前必須聲明對象的名稱和對象類型,然后使用關鍵字new創建對象。

  聲明對象語法:類名 引用變量名

  如:Clock是已經聲明的類名,現在要聲明引用變量alock,用於存儲該類對象的引用:

Clock aclock; //此時並沒有生成對象,只是一個空引用

  創建對象語法:new <類名>()

aclock = new Clock();   //在內存中為Clock類型的對象分配內存空間,返回對象的引用
引用對象可以被賦以空值
aclock = null;

3.數據成員

   數據成員表示對象的狀態,可以是任意的數據類型。

  1.數據成員的聲明  

[public|protected|private][static][final][transient][volatile]
數據類型 變量名1[=變量初值],變量名2[=變量初值],...;

//public、protected、private為訪問控制符
//static 指明這是一個靜態成員變量(類變量)
//final指明變量的值不能被修改
//transient指明變量是不需要序列化的
//volatile指明變量是一個共享變量

  2.實例變量--描述對象的屬性

  沒有static修飾的變量(數據成員)稱為實例變量;

 

  存儲所有實例都需要的屬性,不同實例的屬性值可能不同。

 

  訪問實例屬性的值:<實例名>.<實例變量名>

//圓類保存在文件Circle.java中,測試類保存在文件ShapeTester.java中,兩個文件
//放在相同的目錄下

public class Circle{
	int radius;
}

public class ShapeTester{
	public static void main(String[] args){
		Circle x;
		x = new Circle();
		System.out.println(x);
		System.out.println("radius = " + x.radius);
	}
}
//運行結果
Circle@26b249
radius = 0

  3.類變量

    用static修飾,在整個類中只有一個值,在類初始化的同時就被賦值,適用於與類中中所有對象都相同的屬性,或者需要經常共享的數據,或者在系統中需要用到的一些常量值。

  引用格式:<類名|實例名> <類變量名>

public class Circle{
	static double PI = 3.1415926;
	int radius;
}
//當我們生成Circle類的實例時,在每一個實例中並沒有存儲PI的值,PI的值存儲在類中

public class ClassVariableTester{
	public static void main(String[] args){
		Circle x = new Circle();
		System.out.println(x.PI);
		System.out.println(Circle.PI);
		Circle.PI = 3.14;
		System.out.println(x.PI);
		System.out.println(Circle.PI);
	}
}

//運行結果
3.14159265
3.14159265
3.14
3.14

 

4.方法成員

  1.語法形式

[public|protected|private]
[static][final][abstract][native][synchronized]
返回類型 方法名([參數列表])[throw exceptionList]
{
	方法體
}
//public、protected、private控制訪問權限
//static指明這是一個靜態方法
//final指明這是一個終結方法
//abstract指明這是一個抽象方法
//native用來集成java代碼和其他語言的代碼
//synchronized用來控制多個並發線程對共享數據的訪問

//返回類型:可以是任意的java數據類型,不需返回值時,返回類型為void

//參數類型:可以是簡單數據類型,也可以是引用類型(數組、類或接口);
//參數個數:可以有多個參數,也可以沒有參數,方法聲明時的參數稱之為形式參數

//方法體:為方法的實現,包括局部變量的聲明以及所有合法的java語句,作用域為該方法內部

//throw exceptionList:拋出異常列表

  2.實例方法:表示特定對象的行為,聲明前不需要加static修飾

   調用:給對象發消息,通過調用對象中的某個方法,使用對象的某個行為/功能。

   格式:   

<對象名>.<方法名>([參數列表])
<對象名>為消息的接受者

 參數傳遞

  1.值傳遞:參數類型為基本數據類型時,由形參傳給實參

  2.引用傳遞:參數類型為引用類型時

public class Circle{
	static double PI = 3.14159265;
	int radius;
	public double circumference(){
		return 2*PI*radius;
	}
	public void enlarge(int factor){
		radius = radius * factor;
	}
	public boolean fitsInside(Rectangle r){
		return (2*radius < r.width)&&(2*radius<r.height);
	}
}

public class InsideTester{
    public static void main(String[] args){
        Circle c1 = new Circle();
        c1.radius = 8;
        Circle c2 = new Circle();
        c2.radius = 15;
        Rectangle r = new Rectangle();
        r.width = 20;
        r.height = 30;
        System.out.println("Circle 1 fits inside Rectangle :" + c1.fitsInside(r));
        System.out.println("Circle 2 fits inside Rectangle :" + c2.fitsInside(r));
    }  
}

//運行結果
Circle 1 fits inside Rectangle:true
Circle 2 fits inside Rectangle:false

 

  3.類方法:聲明前需加static修飾

    類方法不能被聲明為抽象的,可以直接通過類名調用,也可以通過類實例調用。  

 

//將攝氏溫度(centigrade)轉換成華氏溫度(Fahrenheit)

public class Converter{
	public static int centigradeToFahenheit(int cent){
		return (cent*9/5 + 32);
	}
}

//方法調用
Converter.centigradeToFahrenheit(40)

  當傳遞的參數為可變長參數時,可用省略號表示,其實質是數組,如String ...s,傳遞給可變長參數的實際參數可以是0到多個對象。

static double maxArea(Circle c,Rectangle... varRec){
	Rectangle[] rec = varRec;
	for(Rectangle r:rec){
		//...
	}
}

public static void main(String[] args){
	Circle c = new Circle();
	Rectangle r1 = new Rectangle();
	Rectangle r2 = new Rectangle();
	System.out.println("max area of c, r1 and r2 is" + maxArea(c,r1,r2));
	System.out.println("max area c and r1 is " + maxArea(c,r1));
	System.out.println("max area c and r2 is " + maxArea(c,r2));
	System.out.println("max area of only c is " + maxArea(c));
}

 

5.聲明枚舉類

   枚舉類聲明格式為

   

[public] enum 枚舉類型名稱
[implements 接口名稱列表]{
     枚舉值;
     變量成員聲明及初始化;
     方法聲明及方法體;  
}

enum Score{
	EXCELLENT,
	QUALIFIED,
	FAILED;
}
public class ScoreTester{
	public static void main(String[] args){
		giveScore(Score.EXCELLENT);
	}
}

public static void giveScore(Score s){
	switch(s){
		case EXCELLENT:
			System.out.println("Excellent");
			break;
		case QUALIFIED:
			System.out.println("Qualified");
			break;
		case FAILED:
			System.out.println("Failed");
			break;
	}
}

  

枚舉類的特點:

1.枚舉類實際上是定義了一個類,隱含繼承java.lang.Enum,因此枚舉類不能再繼承其他任何類;

2.枚舉類型的類體可以包含方法和變量。

3.枚舉類型的構造方法必須是包內私有或者私有的,定義在枚舉開頭的常量會被自動創建,不能顯示地調用枚舉類的構造方法。

枚舉類型的默認方法

1.values()用於獲得枚舉類型的枚舉值數組;

2.toString方法返回枚舉值的字符串描述。

3.valueOf方法將以字符串形式表示的枚舉值轉化成枚舉類型的對象

4.Ordinal方法獲得對象在枚舉類型中的位置索引

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM