1. 程式人生 > >一些課上小疑問

一些課上小疑問

運算 rgs 靜態 例子 錯誤 結果 創建對象 3.3 練習

1.一個jave類文件中真的只能有一個共有類嗎?

public class Test {

public static void main(String[] args) {

}

public class InterClass{

}

}

: 一個jave源文件只能有一個共有類,但共有類中再定義共有類是允許的,如上面的程序在Eclipse中沒有錯誤。

2.main方法

動手實驗:把main()方法的返回值由void改為int,程序能編譯通過嗎?能運行嗎?

public class Hello {

public static int main(String[] args) {

// TODO Auto-generated method stub

System.out.println("Hello");

}

}

不能通過,會出現錯誤,也不能運行。

3.什麽是靜態方法?

靜態方法就是使用 static 關鍵字標識的方法,是使用公共內存空間的,就是說所有對象都可以直接引用,不需要創建對象再使用該方法。

4.思索,為什麽jave規定作為程序入口點的main()方法靜態的?

為什麽要這麽定義,和JVM的運行有關系。

當一個類中有main()方法,執行命令“java 類名”則會啟動虛擬機執行該類中的main方法。

由於JVM在運行這個Java應用程序的時候,首先會調用main方法,調用時不實例化這個類的對象,而是通過類名直接調用。因此需要是限制為public static。

5.變量的作用域

課後練習: Java變量遵循“同名變量的屏蔽原則”,請課後閱讀相關資料弄清楚相關知識,然後自己編寫一些測試代碼,就象本示例一樣,有意識地在不同地方定義一些同名變量,看看輸出的到底是哪個值。

輸出結果:2

原因:因為在java中,局部定義的變量能夠覆蓋全局範圍內的變量。在局部使用某個變量的時候JVM會優先找和當前使用位置""的變量的的定義!如果在局部定義了和全局變量一樣的名字,我們使用的過程中,調用全局變量的話,會使用this關鍵字輔助。

6.java中的類型轉換

動手動腦:查查java中每個數據類型所占位數,和表示數值的範圍,你能得出什麽結論?

byte8位,最大存儲數據量是

255,存放的數據範圍是-128~127之間。

short16位,最大數據存儲量是65536,數據範圍是-32768~32767之間。

int32位,最大數據存儲容量是232次方減1,數據範圍是負的231次方到正的231次方減1

long64位,最大數據存儲容量是264次方減1,數據範圍為負的263次方到正的263次方減1

float32位,數據範圍在3.4e-45~1.4e38,直接賦值時必須在數字後加上fF

double64位,數據範圍在4.9e-324~1.8e308,賦值時可以加dD也可以不加。

boolean:只有truefalse兩個取值。

char16位,存儲Unicode碼,用單引號賦值。

從存儲範圍小的類型到存儲範圍大的類型也存在著精度損失,比如從intfloatdouble,還有從longdouble

7.運行TestDouble代碼並分析結果。

public class TestDouble {

public static void main(String[] args) {

// TODO Auto-generated method stub

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));

}

}

結論是,使用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類

註意:在構造BigDecimal對象時應使用字符串而不是double數值,否則,仍有可能引發計算精度問題。(為什麽會這樣?)

在實際應用中,需要對更大或者更小的數進行運算和處理。floatdouble只能用來做科學計算或者是工程計算,在商業計算中要用java.math.BigDecimalBigDecimal所創建的是對象,我們不能使用傳統的+-*/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是BigDecimal的對象。構造器是類的特殊方法,專門用來創建對象,特別是帶有參數的對象。

7.動手動腦

以下代碼的輸出結果是什麽?

int X=100;

int Y=200;

System.out.println("X+Y="+X+Y);

System.out.println(X+Y+"=X+Y");

為什麽會有這樣的輸出結果?

輸出結果:2

原因:語句一的+是連接符,用來連接X Y 兩個變量,所以輸出的時候是100200的值語句二的+是加法運算符,用來做X+Y運算,輸出的是100+200之後的值

一些課上小疑問