1. 程式人生 > >課程作業02:將課程中的所有動手動腦的問題以及課後實驗性的問題,整理成一篇文檔。

課程作業02:將課程中的所有動手動腦的問題以及課後實驗性的問題,整理成一篇文檔。

運算符 示例 turn 整理 .cn 輸出結果 ole 輸出 兩個

問題1:一個Java類文件中真的只能有一個公有類嗎?請使用Ecplise或javac檢測一下以下代碼,有錯嗎?

技術分享

一個java類文件中只能有一個公有類。用Ecplise測試,當public類嵌套在public類內部時,只執行與文件名相同的public類,不報錯但是不執行內部public;當兩個public類並列時,會報錯,提醒與當前文件名不同的public類必須限定在它自己的文件中。java程序是從一個public類的main函數開始執行的,且一個public 類只能定義在以它的類名為文件名的文件中。 每個編譯單元都只有一個public 類,因為每個編譯單元都只能有一個公共接口,用public類來表現。該接口可以按照要求包含眾多的支持包訪問權限的類。如果有一個以上的public 類,編譯器就會報錯, 並且public類的名稱必須與文件名相同(嚴格區分大小寫)。 當然一個編譯單元內也可以沒有public類。在一個源文件即.java文件中可以有很多類,只有一個public類其他的都不能是,因為需要在public類中找程序的入口 main函數。

問題2:把main方法的返回值由void改為int,程序能編譯通過嗎?能運行嗎?

不能,因為如果改為int,沒有返回值,且加上return語句一樣不能運行,會報錯,提醒“必須返回當前文件public中的空類型值,請將main方法定義為:public static void main(String[] args)”。所以必須這麽定義,這是Java的規範。因為對於java中的main方法,jvm有限制,不能有返回值,故返回值類型為void。

問題3:為什麽java規定作為程序的入口點的main()方法是靜態的?

非靜態成員函數在執行前必須先構造並實例化該函數所在的類。如果允許非靜態的main,那麽main函數所在的類必須先進行實例化,,那麽需要再寫個函數去實例化main所在的類,再調用main,那這個實例化的代碼又寫在哪,如果它也是非靜態的,又要寫個函數去實例化它所在的類。因此java語言就規定了main必須是靜態的。

問題4:請看左邊的示例代碼,輸出結果是什麽?

技術分享

輸出結果:2

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

測試代碼:

技術分享

運行結果:

技術分享

結論:對於同名變量,若變量是在局部內定義並使用,那麽將屏蔽全局變量而使用局部變量的值;若變量是在全局定義並使用,那麽將屏蔽局部變量,而使用全局變量的值。

問題6:看著這個圖,再查查Java中每個數據類型所占的位數,和表示數值的範圍,你能得出什麽結論?

技術分享

byte:8位,最大存儲數據量是255,存放的數據範圍是-128~127之間。
short:16位,最大數據存儲量是65536,數據範圍是-32768~32767之間。
int:32位,最大數據存儲容量是2^32-1,數據範圍是-2^31~2^31-1。
long:64位,最大數據存儲容量是2^64-1,數據範圍為-2^63次~2^63-1。
float:32位,數據範圍在3.4e-45~1.4e38,直接賦值時必須在數字後加上f或F。
double:64位,數據範圍在4.9e-324~1.8e308,賦值時可以加d或D也可以不加。
boolean:只有true和false兩個取值。
char:16位,存儲Unicode碼,用單引號賦值。

結論:低位向高位轉換是自動轉換,無精度損失。高位向低位轉換是強制轉換,有精度損失。

問題7:為什麽double類型的數值進行運算得不到“數學上精確”的結果?

結果與浮點數在計算機內部的表示方法有關系,這種方法問題在於如何在二進制中保存小數點的問題,即利用科學計數法,這樣來保證小數點在第一個位置。由於計算機只能處理0和1,所以在計算機裏面表示浮點數的時候,科學計數法中的基數是2,而不是10。所以說計算機裏面浮點數都是近似值,而不是確切的值。計算機得出的的數值,在大多數情況下需要比64bit更多的位數才能準確表示出來(甚至是需要無窮多位),而double類型的數值只有64bit。後面舍去的位數一定會帶來誤差,因此無法得到“數學上精確”的結果。

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

技術分享

duoble並不能準確的表示BigDecimal 16位有效數字以上的數字。而BigDecimal所創建的對象不能使用+-*/等傳統的算術運算符直接對其對象進行數學運算,必須調用相應的方法。因為方法中的參數必須是BigDecimal的對象,所以定義時應為字符串。

問題9:以下代碼的輸出結果是什麽?

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

對於在System.out.println()語句中的+,如果+的前面是字符串,如“X+Y”就是個字符串,在這種情況下,不管後面接的是什麽類型,都默認是拼接字符串,而不會進行加法運算。

課程作業02:將課程中的所有動手動腦的問題以及課後實驗性的問題,整理成一篇文檔。