1、對于類中的final類型屬性,一般在聲明的時候直接寫final int a =1;
但也可以在構造函數中進行賦值,如:
但要注意:需要每一個構造函數都賦值,且不能嵌套。
而如果想寫static final int a;則必須在聲明時進行初始化,static final int a = 1;因為靜態的也是不屬于類。
2、繼承中要注意的問題:子類對父類中構造方法的問題。
父類的中構造方法不能被繼承,故
class A{} class B extends A{ A();} //是錯的,只能用super關鍵字 |
如果子類中沒有顯示的調用super,則系統會加上,super();注意即是找父類中無參數的構造方法,所以,如果父類自己寫了構造方法而導致無參數的已經不存在了,則會出錯.
3、靜態方法:只屬于類本身,而不是某個對象。它是在類加載的時候,就已經為之分配好內存了。這時,并沒有產生這個的對象。而對象只有在new時候才會出現。所以只能把這個變量加個static.這也叫做類變量,與之對應的叫做實例變量。
4、main是靜態的,因為它不是屬于某個類的,而是全局的。因此在執行時直接找到main,而不是針對某個類的對象。如果不是static,則會先產生類的對象。
public:由于其是虛擬機調用,因此必須是public的。
static:由于其不必產生對象,因此是static的。
5、對于主類的修飾符是default時:表示在同一個包中可以被訪問。
6、final類不能被繼承。
7、private的方法,只要出了類就不能被訪問,不管是在同一個包中,還是繼承關系。默認的訪問權限都是在這個包中,被繼承也不能被訪問。
protected方法對以上均適用,但和public方法也有區別
在于:對于不同包中,沒有繼承關系的兩個類而言,在一個類中使用了另一個類的對象,則只有public方法可以被訪問,而protected方法不能被訪問。
8、抽象方法的聲明:abstract void proMethod(); //不要加大括號
看一個類是否被實現,不是看{}里面有沒有代碼,而是看有沒有{}
9、JNI(Java Native Interface),它允許Java虛擬機(JVM)內部運行的Java代碼能夠與用其它編程語言(如c、c++、匯編語言)編寫的應用程序和庫進行互操作。
JNI可以理解為Java和本地應用程序之間的中介。
它最大的好處是沒有對底層Java虛擬機的實現施加任何限制。
寫一個native的方法:
1)寫java代碼段,如HelloWorld.java。
2)用javac來編譯之,得到.class文件。
3)用javah -jni 來生成HelloWorld頭文件,得到HelloWorld.h
4)用HelloWorld.h來生成本地方法,得到HelloWorldImp.c
5)編譯本地代碼,加載共享庫,生成Hello.so(so文件是linux,或unix下動態連接庫的文件,相當于windows下的.dll)
10、對于接口中的方法,默認情況下就是public abstract的,因此不用再寫,也因此,實現接口時必須用public來修飾。
接口中的數據成員默認都是public static final.
11、
以下是代碼片段: class Z extends A implements B,C { } //注意這個順序先派生類,再實現接口。 |
12、有關內部類:當我們產生一個派生類的對象的時候,它會調用基類的構造函數,產生一個基類的對象。因此
以下是代碼片段: class Car { class Wheel { } } class PlaneWheel extends Car.Wheel { public static void main(String[] args) { PlaneWheel pw = new PlaneWheel(); } } |
這是不能通過編譯的,因為我們要產生pw,就必須先產生Car.Wheel的對象,而它是內部類,所以要產生它的對象,就必須先產生外部類的對象,才能建立起內部與外部的引用關系。
因此作出改變:
以下是代碼片段: class PlaneWheel extends Car.Wheel { PlaneWheel(Car car) { car.super(); } public static void main(String[] args) { Car car = new Car(); PlaneWheel pw = new PlaneWheel(car); } } |
21、javac A.java可以生成B.class,前提是classB在A.java中被聲明為一個類,且不是Public的。
22、finally的問題:不是在try,catch之后的語句就相當于finally,因為如果在try中有return語句,則其后的是不會被執行的。而如果放在finally中,則一定會執行。
如果在代碼中會有一個嚴重錯誤,而不想讓finally中的語句執行,則寫
System.exit(-1);來避免其執行。//不是0就可以。
23、c++中允許程序員重載操作符,但java中不允許。針對String的"+"和"+=",是java中唯一被重載的操作符。
24、StringBuffer的應用:
StringBuffer sb = new StringBuffer().append("a").append("bc").append("123");
可用toString()方法,將其轉化為toString();
由于在打印時會自動調用toString方法,因此,打印時不必顯示加上。
25、java中的索引是從0開始,而且,對于一個區間的數值,是大于等于,小于的關系。即前面的數字是包含的,而后面的是不包含的。
26、java中,傳參時:對于基本數據類型,傳遞的是數據的拷貝;對于引用類型,傳遞的引用的拷貝。但是對于引用的拷貝,是淺拷貝,即指向了堆中同一處內存。
因此在改變值的時結果不一樣,對于基本類型,其回到傳參者時沒有改變其值,而對于引用,其值則改變了。
27、有的接口中沒有任何抽象方法,如cloneable,叫作標識接口。它僅僅是告訴編譯器自己可以被克隆。
如果類中的成員有引用,則涉及到淺拷貝還是深拷貝的問題。
淺拷貝就是把除了引用成員的全都拷貝一份,而對于引用部分則指向同一處。而深拷貝就是把所有的都拷貝一份。
調用super.clone()方法,它可以在運行時刻,object中的clone()識別出你要復制的哪一個對象,然后為此對象分配空間,并進行對象復制,將原始對象的內容一一復制到新對象的存儲空間中。
28、Integer的
valueOf(String s) //把s轉化成一個包裝類對象返回
parseInt(String s) //把s轉化成一個int型數據返回
封裝類的對象的值是不能被修改的,只能是讀。
29、java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成后,在生成的.class文件中,就會產生一個Class對象,用于表示這個類的類型信息。
獲取class實例的三種方式:
a)利用對象調用getClass()方法獲取該對象的class實例;
b)使用class類的靜態方法forName(),用類的名字獲取一個class實例
c)運用.class的方式來獲取class實例,對于基本數據類型的封裝類,還可以用.type來獲取相對應的基本數據類型的class類型。如:
以下是代碼片段: Point pt = new Point(); Class c1 = pt.getClass(); System.out.println(c1.getName()); try{ Class c2 = Class.forName("Point"); System.out.println(c2.getName()); } catch{……} Class c3 = Point.class; System.out.println(c3.getName()); Class c4 = int.class; System.out.println(c4.getName()); Class c5 = Integer.TYPE; System.out.println(c5.getName()); |
30、java中的反射api:主要用于:對于某個不知道名字的類,通過反射機制調用他們的構造函數,為構造函數及其他函數進行傳參,調用。
31、runtime這個類提供了應用程序與環境之間的接口??梢垣@取jvm的總共內存,已占有的內存。用getRuntime()方法獲取其實例。
Runtime rt = Runtime.getRuntime();
System.out.println(rt.freeMemory());
System.out.println(rt.totalMemory());
另可以有執行命令,返回一個process. 為應用程序做準備。
try{rt.exec("notepad");} try{rt.exec(javac ArrayTest.java);}; |
要獲得其具體輸出的信息,可以用process類。
try{ Process p = rt.exec("java ArrayTest"); InputStream is = p.getInputStream();//此時,其輸出全在了 InputStream中 int data; while((data=is.read())!=-1) { System.out.print((char)data); } } |
Runtime類是使用單例模式的一個例子。
32、單例模式:
a)一個類只有一個實例,而且自行實例化并向整個系統提供這個實例,這個類稱為單例類。
b)單例類的一個最重要特點:它是類的構造方法是私有的,從而避免了外部利用構造方法直接創建多個實例。
以下是代碼片段:
class Singleton
{
private static final Singleton st = new Singleton();
private Singleton(){}
public static Singleton getInstance()
{
return st;
}
}