動手動腦及課後實驗整理集合
一個Java類文件中真的只能有一個公有類嗎?
不一定,Java類文件中直接定義的用public修飾符修飾的類確實只能有一個。但是,內部類作為一個類的內部成員,可以使用public修飾符進行修飾。如:
1 public class Test{ 2 public static void main(String[]args){ 3 } 4 public class InnerClass{ 5 } 6 }
這段代碼是沒有問題的。
main方法的返回值能不能由void改為int?
不能運行,這是Java語法規定,這麽寫便於JVM識別調用。
為什麽Java規定作為程序入口點的main方法為靜態的?
首先這是Java語法規定,嚴格記住就好。強行解釋是好處很簡單,不需要定義具體對象就可使用。不過c語言中也沒有作特殊操作,Java裏面main方法同樣不需要顯式調用。所以在我看來這是個拿結果當原因的問題,這就是為了配合jvm的運行才刻意為之。
變量作用域的測試
public class Test{ private static int value =1; public static void main(String[]args){ int value = 2; System.out.println(value); } }
這裏和C語法一樣,方法內重名的局部變量可以屏蔽類屬性。故程序輸出2。
Java數值計算的誤差
public class TestDouble { public static void main(String args[]) { System.out.println("0.05 + 0.01 = " + (0.05 + 0.01)); System.out.println("1.0 - 0.42 = " + (1.0 - 0.42)); System.out.println("4.015 * 100 = " + (4.015 * 100)); System.out.println("123.3 / 100 = " + (123.3 / 100)); } }
輸出結果顯示是有誤差的:
原因是計算機只能識別二進制,因此所有的數值都要轉換為二進制再處理。可是熟悉進制轉換就可以知道,浮點數的轉換非常容易出現精度缺失,因此產生奇葩結果並不奇怪。事實上,浮點數並不適合精確計算,適合科學計算。
再看一個例子:
import java.math.BigDecimal; public class TestBigDecimal { public static void main(String[] args) { BigDecimal f1 = new BigDecimal("0.05"); BigDecimal f2 = BigDecimal.valueOf(0.01); BigDecimal f3 = new BigDecimal(0.05); System.out.println("下面使用String作為BigDecimal構造器參數的計算結果:"); System.out.println("0.05 + 0.01 = " + f1.add(f2)); System.out.println("0.05 - 0.01 = " + f1.subtract(f2)); System.out.println("0.05 * 0.01 = " + f1.multiply(f2)); System.out.println("0.05 / 0.01 = " + f1.divide(f2)); System.out.println("下面使用double作為BigDecimal構造器參數的計算結果:"); System.out.println("0.05 + 0.01 = " + f3.add(f2)); System.out.println("0.05 - 0.01 = " + f3.subtract(f2)); System.out.println("0.05 * 0.01 = " + f3.multiply(f2)); System.out.println("0.05 / 0.01 = " + f3.divide(f2)); } }
再次有奇葩結果輸出:
Java提供的BigDecmial類具有兩種構造方法。一種是以double為參數,一種是以string為參數。而對double類型的四舍五入的計算和進制轉換過程仍會產生精度缺失,計算機在運行程序時並不像我們這樣直接計算。還是鼓勵使用以String為基型來構造一個BigDecmial的實例對象。
最後再來一個結束這次的總結:
public class Test { public static void main(String[] args) { int X=100; int Y=200; System.out.println("X+Y="+X+Y); System.out.println(X+Y+"=X+Y"); } }
輸出結果為:
這樣輸入其實就是個操作符執行順序的問題。第一句輸出先輸出字符串,Java語法規定字符串後與整形相加,整形數值會自動隱式轉換為String類型,因此第一次會直接輸出100200。
第二次+先對兩個整形操作,自然會計算結果再輸出,然後在輸出"=x+y"。
動手動腦及課後實驗整理集合