一些課上小疑問
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中每個數據類型所占位數,和表示數值的範圍,你能得出什麽結論?
byte:8位,最大存儲數據量是
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碼,用單引號賦值。
從存儲範圍小的類型到存儲範圍大的類型也存在著精度損失,比如從int到float,double,還有從long到double。
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數值,否則,仍有可能引發計算精度問題。(為什麽會這樣?)
在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用java.math.BigDecimal。BigDecimal所創建的是對象,我們不能使用傳統的+、-、*、/等算術運算符直接對其對象進行數學運算,而必須調用其相對應的方法。方法中的參數也必須是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 兩個變量,所以輸出的時候是100與200的值。語句二的+是加法運算符,用來做X+Y運算,輸出的是100+200之後的值。
一些課上小疑問