一:原題 二:原題講解 ...
一:原題
1 /* 2 * 運行結果 3 * 2 4 * 1 5 */ 6 public class BookTest { 7 static BookTest book = new BookTest(); 8 static int a; 9 static int b = 0; 10 11 private BookTest() { 12 a++; 13 b++; 14 } 15 16 public static void main(String[] args) { 17 BookTest book = new BookTest(); 18 System.out.println(book.a); 19 System.out.println(book.b); 20 } 21 22 }
二:原題講解
1 package com.heima.test; 2 3 /* 4 *程式執行時,jvm先載入Book類,然後載入new Book(),再載入靜態變數a和靜態變數b;但是 5 *此時並沒有給a和b賦值(使用的是與其數據類型相對應的預設值,也即是兩個靜態變數a=0,b=0 6 *載入進記憶體),所以new Book()調用它的私有構造方法里輸出a=1,b=1;然後給靜態變數賦初值, 7 *也就是我們所給的值a不變,b又變成0(現在a=1,b=0);然後在主方法里又new Book()對象,再 8 *次調用構造方法,也就是a變成了2,b變成了1. 9 */ 10 11 /* 12 * 最後執行結果: 13 構造方法被調用了,調用之前: 14 a=0 b=0 15 構造方法調用之後: 16 a=1 b=1 17 靜態代碼塊被調用了: 18 a=5; b=0 19 構造方法被調用了,調用之前: 20 a=5 b=0 21 構造方法調用之後: 22 a=6 b=1 23 6 24 1 25 */ 26 public class Book { 27 static Book book = new Book(); 28 static int a = 5; 29 static int b = 0; 30 static { 31 System.out.println("靜態代碼塊被調用了:\na=" + a + ";\tb=" + b);// 也可以用Book.a和Book.b 32 } 33 34 private Book() { 35 System.out.println("構造方法被調用了,調用之前:"); 36 System.out.print("a=" + a + "\tb=" + b);// 也可以用Book.a和Book.b 37 a++; 38 b++; 39 System.out.println("\n構造方法調用之後:\na=" + a + "\tb=" + b); 40 } 41 42 public static void main(String[] args) { 43 Book book = new Book(); 44 System.out.println("a最後等於:" + book.a); 45 System.out.println("b最後等於:" + book.b); 46 } 47 48 }