1. 程式人生 > >動手動腦及課後實驗整理集合

動手動腦及課後實驗整理集合

隱式轉換 什麽 src span 轉換 適合 精確 作用域 log

一個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"。

動手動腦及課後實驗整理集合