寫的是一些看了《Java編程思想》4th和網(wǎng)上查的一些資料的總結(jié)婚脱,有錯誤的地方歡迎指正口猜。
靜態(tài)數(shù)據(jù)初始化
不管創(chuàng)建了多少對象都只占用單個存儲區(qū)域灶芝。
static不能應(yīng)用于局部變量缓屠,只能作用于域应闯。
初始化完靜態(tài)數(shù)據(jù)后再初始化非靜態(tài)的。
靜態(tài)數(shù)據(jù)會在加載類時初始化欢瞪,成員變量則會在創(chuàng)建類的對象時才初始化活烙。
class SimpleClass {
{
i = 3;
}
static int i;
}
public void localVariable() {
// static int b = 3; //局部變量里不允許使用static
}
class Test {
public static void main(String[] args) {
// SimpleClass sc = new SimpleClass();
System.out.println(SimpleClass.i);
}
} /*output
0
*/
當(dāng)創(chuàng)建對象時,輸出的結(jié)果是3,當(dāng)注釋掉時遣鼓,輸出的是0啸盏。
成員變量
變量在局部變量里未賦值時,會報錯骑祟。
變量可以通過方法來賦值回懦。
class Test1 {
private int j;
private int i = getI(); //通過方法給變量賦值
public void localVarible() {
int k;
System.out.println(k); //error:變量'k'可能沒有初始化
System.out.println(j);
}
public int getI() {
i = 10;
return i;
}
}
當(dāng)把 System.out.println(k)
注釋掉時編譯成功。
用構(gòu)造器初始化
構(gòu)造器名稱和類名相同次企。
構(gòu)造器是特殊的方法怯晕,它沒有返回值。
java在操作對象前會分配空間,會調(diào)用相應(yīng)的構(gòu)造器,保證初始化缸棵。
默認構(gòu)造器(不含參數(shù))
導(dǎo)出類創(chuàng)建對象時會隱式的調(diào)用超類的默認構(gòu)造器舟茶。如果不調(diào)用超類構(gòu)造器,則當(dāng)導(dǎo)出類調(diào)用超類的變量或方法時會出現(xiàn)還沒有初始化的情況堵第。 參考:
http://zhidao.baidu.com/link?url=Ex3zcGjxl5_XPHnyFBynsUKeBWPGB1j6d6zgLfEOZw4wT-geMILWiCaWPU6yPH4uf3kKwR4mxsUxb7G7ph6W8bDDjRU1UsL8GN74QVMiucq
class Super {
Super() {
System.out.println("Super()");
}
}
class Derived extends Super {
Derived() {
System.out.println("Derive()");
}
}
class Main {
public static void main(String[] args) {
Derived d = new Derived(); //會先調(diào)用超類的構(gòu)造器
}
}/*output
Super()
Derived() */
含參構(gòu)造器
構(gòu)造器也可以帶參數(shù), 當(dāng)只有一種構(gòu)造器時吧凉,將不會其他任何的形式來創(chuàng)建對象 。
當(dāng)超類中只有含參的構(gòu)造器時踏志,導(dǎo)出類初始化時必須先用super
調(diào)用超類構(gòu)造器阀捅。
class Super {
Super(String str) {
System.out.println("Super(str)");
}
}
class Derived extends Super {
Derived() {
super("str");
System.out.println("Derived()");
}
Derived(String str) {
super("str");
System.out.println("Derived(str)");
}
}
為了保證導(dǎo)出類的成員和方法正確的初始化,當(dāng)注釋掉 super("str")
時會報錯针余。
數(shù)組初始化
數(shù)組之間賦值傳遞的是引用饲鄙。
class ArrayInitialization {
public static void main(String[] args) {
int[] i = {1, 2, 3, 4, 5, 6};
int[] j = i;
for (int n = 0; n < i.length; n++)
i[n] = i[n] + 1;
for (int n : j)
System.out.println(n);
}
} /**output
2
3
4
5
6
7 * /
繼承初始化
class Super {
static {
System.out.println("超類靜態(tài)初始化塊");
}
static int i = 5;
int j = 6;
{
System.out.println("超類普通初始化塊");
}
Super() {
System.out.println("Super()");
}
}
class Derived extends Super {
static int k = 10;
static {
System.out.println("導(dǎo)出類靜態(tài)初始化塊");
}
{
System.out.println("導(dǎo)出類普通初始化塊");
}
int h = 11;
Derived() {
System.out.println("Derived()");
}
public static void main(String[] args) {
Derived d = new Derived();
}
} /** output:
超類靜態(tài)初始化塊
導(dǎo)出類靜態(tài)初始化塊
超類普通初始化塊
Super()
導(dǎo)出類普通初始化塊
Derived() */
當(dāng)沒有繼承關(guān)系且只創(chuàng)建Super
對象時:
class Super {
static {
System.out.println("超類靜態(tài)初始化塊");
}
static int i = 5;
int j = 6;
{
System.out.println("超類普通初始化塊");
}
Super() {
System.out.println("Super()");
}
}
class Derived {
static int k = 10;
static {
System.out.println("導(dǎo)出類靜態(tài)初始化塊");
}
{
System.out.println("導(dǎo)出類普通初始化塊");
}
int h = 11;
Derived() {
System.out.println("Derived()");
}
public static void main(String[] args) {
Super s = new Super();
}
} /*
導(dǎo)出類靜態(tài)初始化塊
超類靜態(tài)初始化塊
超類普通初始化塊
Super()
*/
這時候會先初始化Derived
類的靜態(tài)數(shù)據(jù),再始初化Super
的靜態(tài)數(shù)據(jù)圆雁。因為JVM虛擬機會先加載類的main方法傍妒,判斷其有無超類,如果沒有就直接初始化靜態(tài)數(shù)據(jù)摸柄;如果有就先初始化基類的構(gòu)造器颤练。
初始化順序:
在初始化之前會把所有成員都賦初始值(0,null等)驱负。
超類靜態(tài)代碼塊 >> i >> k >> 導(dǎo)出類靜態(tài)代碼塊 >> j >>超類靜態(tài)代碼塊 >> 超類構(gòu)造器 >> 導(dǎo)出類靜態(tài)代碼塊 >> h >> 導(dǎo)出類構(gòu)造器 嗦玖。
向上轉(zhuǎn)型時
當(dāng)導(dǎo)出類構(gòu)造器重寫了超類構(gòu)造器調(diào)用的方法后,在創(chuàng)建了對象進行初始化時超類構(gòu)造器會調(diào)用導(dǎo)出類覆寫的方法跃脊,但變量不會被重寫宇挫,可以當(dāng)它隱式的用private
修飾了。
class Super {
public int i = 3;
public int j = 4;
public Super() {
System.out.println("i = " + i + ", j = " + j);
rewriteMethod();
}
public void rewriteMethod() {
System.out.println("Super's method");
}
}
class Derived extends Super {
public int i = 5;
public int j = 6;
public Derived() {
System.out.println("i = " + i + ", j = " + j);
rewriteMethod();
}
@Override
public void rewriteMethod() {
System.out.println("Derived's method");
}
}
class Main {
public static void main(String[] args) {
Super s = new Derived();
}
}
/*output:
i = 3, j = 4
Derived's method
i = 5, j = 6
Derived's method*/