概念
類可以看成是建立Java對象的模板。
類是客觀存在的,抽象的,概念的東西。
類必須使用class關鍵字來表明這是一個類。
既然是類,java允許類不加public關鍵字約束,當然類的定義只能限制為public或者無限制關鍵字(預設的)。
例如一個人類:
public class Person{
}
或者
class Person{
}
上述執行個體中,public關鍵字是這個類的存取權限,class關鍵字表明這是一個類,Person是類的名稱。
main方法
main()方法的聲明為:public static void main(String args[])。必須這麼定義,這是Java的規範。
當一個類中有main()方法,執行命令“java 類名”則會啟動虛擬機器執行該類中的main方法。
由於JVM在運行這個Java應用程式的時候,首先會調用main方法,調用時不執行個體化這個類的對象,而是通過類名直接調用因此需要是限制為public static。
對於java中的main方法,jvm有限制,不能有傳回值,因此傳回值類型為void。 main方法中還有一個輸入參數,類型為String[],這個也是java的規範,main()方法中必須有一個入參,類細必須String[],至於字串數組的名字,這個是可以自己設定的,根據習慣,這個字串數組的名字一般和sun java規範範例中mian參數名保持一致,取名為args。
因此,main()方法定義必須是:“public static void main(String 字串數組參數名[])”。
HelloWord執行個體:
public class HelloWord{
public static void main(String [] args){
System.out.print("HelloWord");
}
}
存取權限
Java中,可以使用存取控制符來保護對類、變數、方法和構造方法的訪問。Java支援4種不同的存取權限。
預設存取修飾詞-不使用任何關鍵字
介面裡的變數都隱式聲明為public static final,而介面裡的方法預設情況下存取權限為public。
請注意以下方法繼承的規則:
1.父類中聲明為public的方法在子類中也必須為public。
2.父類中聲明為protected的方法在子類中要麼聲明為protected,要麼聲明為public。不能聲明為private。
3.父類中預設修飾符聲明的方法,能夠在子類中聲明為private。
4.父類中聲明為private的方法,不能夠被繼承。
執行個體:
class Test1{
private static int age = 1;
public static int age2 = 2;
protected static int age3 = 3;
static int age4 = 4;
}
public class Test2 extends Test1{
public static void main(String [] args){
//System.out.print(age);//no
System.out.print(age2);//yes
System.out.print(age3);//yes
System.out.print(age4);//yes
}
}
java類載入機制的過程
1. 積極式載入與依需求載入
Java 運行所需要的基本類採用積極式載入,的方法全部載入要記憶體當中,因為這些單元在 Java 程式啟動並執行過程當中經常要使用的,主要包括 JRE 的 rt.jar 檔案裡面所有的 .class 檔案。
我們在程式中需要使用自己定義的類的時候就要使用依需求載入方法。
2. 隱式載入和顯示載入
程式中用 new 關鍵字來定義一個執行個體變數, JRE 在執行到 new 關鍵字的時候就會把對應的執行個體類載入進入記憶體,用的也很多, JRE 系統在後台自動的協助使用者載入,減少了使用者的工作量,也增加了系統的安全性和程式的可讀性。
程式員自己寫程式把需要的類載入到記憶體當中(顯示載入)
Class c = Class.forName("TestClass");
TestClass object = (TestClass)c.newInstance
我們通過 Class 類的 forName (String s) 方法把自訂類 TestClass 載入進來,並通過 newInstance ()方法把執行個體初始化
Test test = new Test();//Test 類為自訂的一個測試類別;
ClassLoader cl = test. getClass().getClassLoader();
// 擷取 test 的類裝載器;
Class c = Class.forName("TestClass", true, cl);
因為一個類要載入就必需要有載入器,這裡我們是通過擷取載入 Test 類的載入器 cl 當作載入 TestClass 的類載入器來實現載入的。
3. 自訂類載入機制
URL url = new URL("file:/d:/test/lib/");
URLClassLoader urlCL = new URLClassLoader(new URL[]{url});
Class c = urlCL.loadClass("TestClassA");
TestClassA object = (TestClassA)c.newInstance();
object.method();
首先定義 URL 指定類載入器從何處載入類, URL 可以指向網際網路上的任何位置,也可以指向我們電腦裡的檔案系統 ( 包含 JAR 檔案 ) .上述範例當中我們從 file:/d:/test/lib/ 處尋找類;然後定義 URLClassLoader 來載入所需的類,最後即可使用該執行個體了。
4. 類載入器的階層體系
當執行hllo.class時候,java.exe會自動找到很顯眼的jre位置,接著會在其中找到jvm.dll,(在jdk和jre中都有jvm)有了.dll檔案之後啟用jvm載入動態庫,jvm活後,先做一些初始化的動作,比如說讀取系統參數等。
然後,一旦初始化動作完成之後,就會產生第一個類載入器?? Bootstrap Loader (靴帶機制,就是繫上鞋帶就要走路了), Bootstrap Loader 是由 C++ 所撰寫而成,這個 Bootstrap Loader 所做的初始工作中,除了一些基本的初始化動作之外,最重要的就是載入 Launcher.java 之中的 ExtClassLoader ,並設定其 Parent 為 null ,代表其父載入器為 BootstrapLoader .然後 Bootstrap Loader 再要求載入 Launcher.java 之中的 AppClassLoader ,並設定其 Parent 為之前產生的 ExtClassLoader 實體。這兩個載入器都是以靜態類的形式存在的。這裡要請大家注意的是, Launcher$ExtClassLoader.class 與 Launcher$AppClassLoader.class 都是由 Bootstrap Loader 所載入,所以 Parent 和由哪個類載入器載入沒有關係。
這三個載入器就構成我們的 Java 類載入體系。他們分別從以下的路徑尋找程式所需要的類:
BootstrapLoader : sun.boot.class.path
ExtClassLoader: java.ext.dirs
AppClassLoader: java.class.path
這三個系統參量可以通過 System.getProperty() 函數得到具體對應的路徑。大家可以自己編程實現查看具體的路徑。