課程作業第二題
為什麽java規定作為程序入口點的main()方法是靜態的?
回答:非靜態成員函數在執行前必須先構造並實例化該函數所在的類。如果允許非靜態的main,那麽main函數所在的類必須先進行實例化,那麽就需要寫個函數去實例化main所在的類,再調用main,這個實例化的代碼有些在哪裏呢?如果它也是非靜態的,豈不是又要寫個函數去實例化它所在的類嗎?因此,java語言就規定了main必須是靜態的。
每個變量都有一個有效的區域(成為作用域),出了這個區域,變量將不再有效。
publiv class Text{
private static int value=1;
public static void main(String[] args){
int value=2;
System.out,println(value);
}
}
請看上面的示例代碼,輸出結果是什麽?
輸出結果:2
為什麽double類型的數值進行運算得不到“數學上精確”的結果?
這個涉及到二進制與十進制的轉換問題。
N進制可以理解為:數值×基數的冪,例如我們熟悉的十進制數123.4=1×102+2×10+3×(10的0次冪)+4×(10的-1次冪);其它進制的也是同理,例如二進制數11.01=1×2+1×(2的0次冪)+0+1×(2的-2次冪)=十進制的3.25。
double類型的數值占用64bit,即64個二進制數,除去最高位表示正負符號的位,在最低位上一定會與實際數據存在誤差(除非實際數據恰好是2的n次方)。
舉個例子來說,比如要用4bit來表示小數3.26,從高到低位依次對應2的1,0,-1,-2次冪,根據最上面的分析,應當在二進制數11.01(對應十進制的3.25)和11.10(對應十進制的3.5)之間選擇。
簡單來說就是我們給出的數值,在大多數情況下需要比64bit更多的位數才能準確表示出來(甚至是需要無窮多位),而double類型的數值只有64bit,後面舍去的位數一定會帶來誤差,無法得到“數學上精確”的結果。
在構建BigDecimal對象時應使用字符串而不是double數值,否則,仍有可能引發精度問題。(為什麽會這樣呢?)
參數類型為double的構造方法的結果有一定的不可預知性。有人可能認為在Java中寫入newBigDecimal(0.1)所創建的BigDecimal正好等於 0.1(非標度值 1,其標度為 1),但是它實際上等於0.1000000000000000055511151231257827021181583404541015625。這是因為0.1無法準確地表示為 double(或者說對於該情況,不能表示為任何有限長度的二進制小數)。這樣,傳入到構造方法的值不會正好等於 0.1(雖然表面上等於該值)。
以下代碼的輸出結果是什麽?
int x=100;
int y=200;
System.out.println("x+y="+x+y);
System.out.println(x+y+"=x+y");
輸出:x+y=100200;
300=x+y;
為什麽會有這樣的輸出結果呢?
因為+號是在java做了運算符重載
通俗一點的解釋: 假如 x = 10, y = 20 x= 為一個字符串 ,y= 為一個字符串 "x=" + x 的意思就是 吧 "x=" 這字符串和x這個變量的值拼接起來組成一個新的字符串(str1): x=10 "x=" + x + ",y=" 前面拼接的str1 在和 ",y=" 這個字符串拼接成一個新的字符串 (str2): x=10,y= "x=" + x + ",y=" + y 前面拼接的str2 和y這個變量的值拼接組成一個新的字符串,成為最終的字符串: x=10,y=20。
課程作業第二題