Java是一種面向對象(OOP)的編程語言;在Java中,面向對象是以類的形式出現的,而對象則是類的實例,所以要學習Java的類首先必須了解面向對象。面向對象編程不同於過程語言或結構化程序設計,他存在對象這個概念,面向對象中的對象不僅是數據結構,還包含和數據結構有關的方法。
一:類
1.類的聲明及實例化
類是面向對象要害,可以說沒有類就沒有對象;類具有兩個優點,首先,他答應封裝;即將數據和方法封裝起來使得這方面的信息和其他程序有效的分開,封裝的好處是假如修改了這個類,只要沒改變這個類中的方法就不需要動別的程序;類的第二個優點是答應繼續。
類由兩部分組成,第一部分是類的變量的聲明,到二部分類中的方法;以下是創建一個叫test的類:
public class test{ //聲明一個類
String name; //類的變量的聲明
changtest(){ //類的方法
name="text";
}
}
在上面聲明一個類時使用了修飾符"public".在聲明類時可以使用三中說明符:public,final和abstract。
public類意味這個類可以被任何對象使用和擴展,而且與他的包無關;
final類則表明這個類沒有任何子類;
abstract類即說明這個類是一個抽象類;
假如類聲明前沒有任何修飾符,則默認為protected類,即只有同一個包中的對象才能使用該類。
前面已經說了類有個優點是答應繼續,這就說明新建的類可以使用已建類的變量和方法,這樣通過基於簡單的類建立較大的類的方法,可以減少許多代碼的編寫,也減少了在程序中查找和修改錯誤的工作;以下例子建立一個類MyClass,他繼續了類test中所有的變量和方法:
public class MyClass extends test{}
其中類MyClss被稱為子類,類test被稱為父類或超類.
當創建了類後,就可以用new來創建類的一個實例,並不是所有的類都需要創建他的實例,假如要使用的類中的方法或變量是靜態的,就可以不用創建這個類的實例,但是靜態的方法只能引用靜態的類變量(System類的out變量是一個例外);以下例子創建類test的一個實例:
test mytest=new test();
創建類的實例是為了要引用這個類中的變量或方法,前面已經為類test創建了一個實例mytest,假如類test中包含了一個方法changtest(),可以用如下方式來引用:
mytest.changtest();
2.類的變量
聲明類的變量和聲明類類似,前面可以跟上修飾符;變量有以下幾種修飾符:
public--變量在所有類中可視;包括包中的類和所有子類。
protected--變量可以被當前類中的所有方法訪問,但是在當前包以外的類中不可見。
private--變量只能被當前類中的所有方法訪問。
static--聲明此變量為靜態變量。
final--該修飾符說明此變量的值在運行期間不能被修改。
為什麼不把所有變量都聲明成全局變量呢?有兩個原因:第一個原因是這樣做將浪費大量的內存;第二個原因是假如把所有變量都聲明成全局變量會使得程序難以閱讀。
在類中有兩個非凡的變量:this和super;
在以下兩種情況中需要使用this變量:
在類中有兩個變量同名,其中一個屬於當前類而另一個屬於某個特定的方法。
當某個類需要將類作為參數傳遞給某個方法。
以下情況需要使用super變量:
當覆蓋方法時,有時候希望使用老方法中的代碼,這是可以使用super變量來獲取原來的代碼。
3.有時候為了做一個項目需要建立一大堆的類,這些類文件就象沒有子目錄或文件夾的硬盤一樣是雜亂無章的,為了方便治理所以引入了包,這樣就可以將有著相關的類放在一個包中,包就象是文件夾或子目錄。要想使某個類成為包的成員,必須使用package來聲明他,要注重的是package語句必須是文件的第一行,package語句前面除了空白和注釋不能有任何東西;例如:
package packagename;
假如要引用包packagename中的類則用以下方式:
import packagename.*;
以上命令是引用包packagename中的所有類,假如你只引用這個包中的某個類可以用以下方式:
import packagename.classname;
也許有人會問引用整個包中的類不好嗎?為什麼還要指定是某個類呢?原因有以下幾點:
首先當引用不在本地機器上的整個包,程序將通過網絡將包的所有文件都拖過來,假如這個包有上千個類,而你只使用其中很少的部分,將浪費很多資源。
假如引用的兩個包中有共享的文件名(例如包pack1中有個叫classname的類,pack2中也有個叫classname的類,假如你使用import pack1.*;import pack2.*),你的系統就要崩潰了。
4.下面就用一個例子來具體介紹如何創建,實例一個類:
**********************************************************************************************
//聲明類tools是屬於包mypack
package mypack;
//聲明一個公共的類tools
public class tools {
public tools() {
}
/**
*聲明類的方法replace()
*此方法在一個字符串裡查找某個特定的字符串,假如找到,則將這個字符串替換成另外一個字符串
*假如找到返回替換後的字符串,假如未找到則返回原字符串
*replace(整個字符串,被替換的字符串,替換後的字符串)
*值得說明的是由於我是使用while,所以假如原字符串為"ababcdcd",要將字符串"ab"替換成"e",則輸出為"eecdcd"
*假如只是想將原字符串中的第一個被找到的字符串替換掉,則將while換成if即可
*/
public String replace(String allstr,String replstr1,String replstr2) {
while(allstr.indexOf(replstr1)!=-1)
allstr=allstr.substring(0,allstr.indexOf(replstr1))+replstr2+allstr.substring(allstr.indexOf(replstr1)+replstr1.length());
return allstr;
}
public static void main(String[] args) {
//生成類tools的實例t
tools t=new tools();
//用類tools的方法replace()將字符串"abcd"替換成"adcd"並輸出到控制台
System.out.print(t.replace("abcd","b","d"));
}
}
***********************************************************************************************
二:接口
1.前面講了類有個重要的特性就是繼續,但是一個類只能有一個父類,為了實現象C++中的多繼續性,就必須使用接口;接口和類非常相似,接口用於定義幾個類具有的但又不在這些類中定義的功能,通過在接口中設置這些方法,描述出共同的特性,至於如何實現則是類本身的事。由於接口的這個特性,就意味著在接口中只能定義抽象的方法而不能有方法體;這又於類的定義相違反了,這就造成了接口不能擴展類。另外接口還有一個與類不同的地方是接口聲明的變量必須是靜態變量。下面語句定義了一個接口:
public interface interf
值得注重的是,假如使用了擴展的接口,必須將老接口的方法和新接口的方法全部覆蓋掉。在覆蓋方法時方法名和參數都必須和老方法一致,假如只是方法名相同而參數不同那將重載該方法,但不會覆蓋該方法。