類是一個模板,它描述一類對象的行為和狀態;對象是類的一個具體的實例,由類構造對象的過程稱為創建類的實例。如:路燈是一個類,每一個路燈就是該類的對象。
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方法將以字符串形式表示的枚舉值轉化成枚舉類型的對象