1.數據類型
整型:(Short)( 佔 2 個字節 ) 、整數 (Int)( 佔 4 個字節 ) 與長整數 (Long)( 佔 8 個字節 )
浮點數: 單精度浮點數 (Float)( 佔 4 個字節 ) 與雙精度浮點數 (Double)( 佔 8 個字節 , 帶小數點的數字默認是double型)
字符: Java 的字符采用 Unicode 編碼, 每個字符數據類型佔 2 個字節,可存儲的字符範圍從 /u0000 到 /uFFFF 。 一箇中文字與一個英文字母在 Java 中同樣都是用一個字符來表示。
布爾:佔內存 1 個字節,可存儲 True 與 False 兩個數值
移位操作要注意的問題是高(低)位是補0還是補1和對char, byte, short型的操作:
(1)<< : (left-shift), 最低位補0
(2)>> : (signed right-shift), 右移過程使用符號位擴展(sign extension),即如果符號爲爲1則高位補1, 是0則補0,也就是邏輯右移
(3)>>> : (unsigned right-shit),右移過程使用零擴展(zero extension),即最高位一律補0,也就是算術右移
(4)
移位操作的數據類型可以是byte, char, short, int, long型,但是對byte, char,
short進行操作時會先把它們變成一個int型,最後得到一個int型的結果,對long型操作時得到一個long型結果,不可以對boolean型進
行操作。
(5)移位操作符可以和=合併起來,即 <<= 、 >>= 和 >>>=。例如 a >>= 2; 表示將a右移兩位後的值重新賦給a。
2. overload和override的區別
override(重寫)
(1)、方法名、參數、返回值相同。 (2)、子類方法不能縮小父類方法的訪問權限。 (3)、子類方法不能拋出比父類方法更多的異常(但子類方法可以不拋出異常)。
overload(重載)
(1)、參數類型、個數、順序至少有一個不相同。 (2)、不能重載只有返回值不同的方法名。(3)、存在於父類和子類、同類中。
* 設兩個父子類Parent Child
overload方法: fun(Parent p) fun(Child c)
在主程序中:
a) Parent p=new Child();
fun(p) 是調用fun(Parent p)方法
b) Child p =new Child();
fun(p) 是調用fun(Child c)方法. 如果無fun(Child c),則會調用fun(Parent p)方法
* 再加兩個父子類Upper,Lower
Upper upper=new Lower();
Child p=new Child();
則調用upper.fun(p)時,系統首先尋找順序爲:Lower類中的fun(Child c) --> Upper類中的fun(Child c) --> Lower類中的fun(Parent p) --> Upper類中的fun(Parent p)
* 上例中如果第二句爲Parent p=new Child();則尋找的順序:Lower類中的fun(Parent p) --> Upper類中的fun(Parent p)
*總結:子對象在override和overload中可以代替父對象。但override優先選擇new對象類型中的方法, overload優先選擇指針的定義的類型。
屬性是不會override的。故Parent和Child都有public int i;時,當Parent p =new Child()時,p.i是指Parnet類中的i
在方法中使用屬性是優先使用本實例中的屬性,如果沒有,則尋找父類中的屬性。
2. try catch後面接finally{},如果在try{ return },返回後仍然會執行finally{}語句。再接下來執行調用此函數的下一句。
3.異常
Throwable
+-- Exception
+ +-- RuntimeException (如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理)
+ +--checked exception( 除RE的異常) 如IOException、SQLException等以及用戶自定義的Exception異常,必須要處理
+-- Error(可不處理,因爲這表示java運行環境中的內部錯誤或者硬件問題,比如,內存資源不足等)
4.hashcode()與equals()
java.lnag.Object中對hashCode的約定:
1. 在一個應用程序執行期間,如果一個對象的equals方法做比較所用到的信息沒有被修改的話,則對該對象調用hashCode方法多次,它必須始終如一地返回同一個整數。
2. 如果兩個對象根據equals(Object o)方法是相等的,則調用這兩個對象中任一對象的hashCode方法必須產生相同的整數結果。
3. 如果兩個對象根據equals(Object o)方法是不相等的,則調用這兩個對象中任一個對象的hashCode方法,不要求產生不同的整數結果。但如果能不同,則可能提高散列表的性能。
不改寫hashCode導致使用hashMap不能出現預期結果.
4.子父類對象創建時代碼順序
父對象: arrtibute=value; (1) 分配內存
{ } (2)
construction(){} (3)
子對象: attribute=value; (4)
{ } (5)
construction(){} (6)
5.性能(1>2)
1.1 synchronized(this) {
for() { ... }
}
1.2 for(){
synchronized(this) { ... }
}
2.1 try{
synchronized(this) { ... }
}catch{ ...}
2.2 synchronized(this){
try{...} catch{...}
}
5.內部類
1)成員內部類
public class OuterClass{ //外部類
private class InnerClass{ //內部類
//...
}
}
* 外部使用方法:
OuterClass outerClass=new OuterClass ();
InnerClass innerClass= outerClass .new InnerClass ();
* 不能在成員類中定義static字段、方法和類(static final形式的常量定義除外)如果方法和變量要成爲靜態,內部類必須被聲明爲靜態。
* 成員類內部獲得其所屬外部類實例呢:OuterClass.this
* 成員類能訪問它的外部類實例的任意字段與方法。方便一個類對外提供一個公共接口的實現。
private class Itr implements Iterator < E > {
………;
}
public Iterator < E > iterator() {
return new Itr();
}
}
2)靜態內部類
引用方法: OuterClass.InnerClass, 其它和外部類一樣。
public
class
LinkedList
<
E
>
extends
AbstractSequentialList
<
E
>
…;
private
static
class
Entry
<
E
>
{
E element;
Entry
<
E
>
next;
Entry
<
E
>
previous;
Entry(E element, Entry
<
E
>
next, Entry
<
E
>
previous) {
this
.element
=
element;
this
.next
=
next;
this
.previous
=
previous;
}
}
…;
}
3) 匿名內部類
new ClassName(){
...//內部類體
};
內部類體可override這個類的方法
4)局部內部類
public class OuterClass {
public OutInterface doit(final String x) { //doit()方法參數爲final類型
class InnerClass implements OutInterface { //在doit()方法中定義一個內部類
InnerClass(String s) {
s = x;
System.out.println(s);
}
}
return new InnerClass("doit");
}
}
6.reflection
(1) java xxx.class--->尋找JRE/bin/clinet目錄中jvm.dll--->啓動JVM
BootstrapLoader (由C編寫,搜索sun.boot.class.path路徑下的class文件,默認爲JRE/classes)
ExtClassLoader
Extended Loader(,由java編寫,搜索java.ext.dirs中指定的類,默認是JRE/lib/ext/classes目錄下的class文件 或 lib/ext目錄下的jar文件)
AppClassLoader
System Loader(, java.class.path中指定的位置的類,也就是classpath所指定的路徑
每個類加載器會先將加載類的任務交給其parent,如果parent找不到,再由自己找。
bootstrapLoader<----getParent()----ExtClassLoader<------getParent()--------AppClassLoader <-----getClassLoader()-----SomeClass<------getClass()-------Someclass實例
(2)生成實例
1)Class c=Class.forName("包名.類名"); /相當於Class.forName("包名.類名",true, loader); 執行static初始化代碼
2) Class c=Class.forName("包名.類名",false, loader); //jdk1.4前未執行static初始化代碼,不過靜態變量還是初始化
3) ClassLoader loader=main.class.getClassLoader(); //如果是實例,可用this.getClass().getClassLoader(), 還可用Thread.currentThread().getClass().getClassLoader();
Class c=loader.loadClass("包名.類名");
* 然後爲c.newInstance();生成實例
(3)
自定義ClassLoader類裝載,鼓勵用 ClassLoader
的子類重寫 findClass(String)
,而不是重載Class loadClass(string)方法。重載Class findClass(String name)
byte[] bytes = 從name類名中取得字節流;
Class theClass = defineClass(name, bytes, 0, bytes.length);
(4) 方法
7性能
1) java的一些類中,比如是集合類,會默認分配其空間大小,如果編程時能預知其大小,可在創建其對象時指定創建時分配的大小。
2) StringBuilder