單例模型和靜態載入綜合運用(優酷面試題),模型靜態
一:原題
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=015 構造方法調用之後:16 a=1 b=117 靜態代碼塊被調用了:18 a=5; b=019 構造方法被調用了,調用之前:20 a=5 b=021 構造方法調用之後:22 a=6 b=123 624 125 */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.b32 }33 34 private Book() {35 System.out.println("構造方法被調用了,調用之前:");36 System.out.print("a=" + a + "\tb=" + b);// 也可以用Book.a和Book.b37 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 }