第一章 Java開發環境
1.Java的跨平臺原理
java的編程過程爲:java源程序(.java文件)經過java編譯程序編譯後生成java字節碼文件,即(.class文件),然後交給java虛擬機執行,java虛擬機中經過java字節碼解釋程序執行後在交給操作系統。
windows下c編程過程:c源程序(.c文件)經過c編譯程序編譯後生成windows下可執行文件(即.exe文件),.exe文件就可以再操作系統上直接運行。
由此可見java相對於c的跨平臺性主要是在實現了java解釋器的平臺上可以對任何編譯過的java字節碼文件解釋執行。此外,java兼顧解釋性和編譯性語言的特點,java源文件轉換成.class字節碼文件的過程是編譯型的,.class文件在操作系統上運行的過程則是解釋型的。
2.classpath和path的區別
path環境變量的作用是設置共操作系統去尋找和執行應用程序的路徑,即,若操作系統在當前目錄下沒有找到我們想要執行的程序和命令時,操作系統就會按照path環境變量指定的目錄依次去查找,以最先找到的爲準;classpath的作用類型path環境變量的作用,只是它是供Java虛擬機使用,Java虛擬機按照classpath環境變量指定的目錄順序去查找這個類,以最先找到爲準,但設置classpath後java虛擬機將不在當前目錄查找。(要想讓java虛擬機即在classpath指定的路徑下查找,又在當前目錄查找,設置時可以在class環境變量中加一個“.”,如:“set classpath=C:\mydir;.”)。
3.設置classpath路徑時注意事項
在配置java環境變量的時候經常因爲空格而導致錯誤。比如如下兩種錯誤:
①set classpath =c:\mydir;等號和classpath之間有空格,這樣本來是設置classpath的值變成了設置“classpath+空格”的值;
②set classpath= c:\mydir;等號和路徑名之間有空格,把路徑變成了“空格+C:\mydir”,導致了路徑設置的錯誤。
還有一種是路徑裏有空格,因爲windows允許帶空格的目錄名,但java不允許,java對空格和中文敏感。
4.快速得到路徑字符串的方法
可以在windows操作系統的文件夾選項對話框中,選中“地址欄中顯示全路徑”,選項,在進入某個目錄後可以Ctrl+C複製路徑;也可以將目錄下的某個文件拖入到運行對話框,也可以得到路徑。
得到路徑後在運行對話框中要到左上角點擊後出來標記後才能操作。
在命令行窗口中,經常要用到cd命令進入子目錄後其他目錄,如果目錄的名稱比較長,可以只輸入目錄名中的部分字符,其他字符用*代替,如可以用cd tos*進入toshiba_bak目錄。
4.java中常見dos命令行
dir : 列出當前目錄下的文件以及文件夾
md : 創建目錄
rd : 刪除目錄
cd : 進入指定目錄
cd.. : 退回到上一級目錄
cd/ : 退回到根目錄
del : 刪除文件
exit : 退出dos命令行
設置環境變量的時候注意:在環境變量的名字裏面,空格也算是名字的組成部分,
查看系統的環境變量的方法是用set命令即可查看所有的環境變量名和取值,也可以加環境變量的名字來查看具體的環境變量的值,如:set path即可查看path環境變量的取值。
classpath環境變量的值就是指定class文件的一系列的路徑,java虛擬機會沿着classpath環境變量中所指定的目錄,依次查找這個類文件。可以讓指定class文件在不同的盤符下運行。
第二章 Java語法基礎二.Java語言基礎組成
1 關鍵字
被Java語言賦予了特殊含義的單詞(所有字母都小寫如if,false,null)
2 標識符
在程序中自定義的一些名稱。(數字不可以開頭,不可以使用關鍵字。)
Java中的名稱規範:
包名:多單詞組成時所有字母都小寫。xxxyyyzzz
類名接口名:多單詞組成時,所有單詞的首字母大寫。XxxYyyZzz
變量名和函數名:多單詞組成時,第一個單詞首字母小寫,第二 個單詞開始每個單詞首字母大寫。xxxYyyZzz
常量名:所有字母都大寫。多單詞時每個單詞用下劃線連接。XXX_YYY_ZZZ
3 註釋
4 常量和變量
表達式的數據類型自動提升:(自動類型轉換要是兩種類型彼此兼容的類型)
所有的byte型,short型,char型的值將被提升到int型再參與運算。
如果有一個操作數是long型,計算結果就是long型。
如果有一個操作數是float型,計算結果就是float型。
如果有一個操作數是double型,計算結果就是double型。
System.out.println('a'+1')打印結果是98而System.out.println(" "+'a'+1')打印結果是“a1‘。
上述規則使用與變量不合用與常量,char i='a';int a= i+5;編譯可以通過,但int a=‘a’+3;則通不過
浮點數在內存中的表現形式:用二進制的指數形式表示一個浮點數的格式
float:把4個字節(32位)分爲三部分,最高位代表符號位,接下來的8位代表冪指數,剩下的23位代表有效數字。
因爲浮點數是有精度的,所以程序中一般不能用“==”來做比較,一般用大於小於來比較。
小數常量的默認類型是double型的,所以float f=3.5;編譯報錯,應改爲float f=3.5f;
字符串常量:
String類對象中的內容一旦被初始化就不能改變。
String類的對象是一個常量對象,當我們需要爲String的對象重新賦值的時候,Java虛擬機會重新分配一塊內存存放新產生的String類型的對象,然後將新分配的那塊內存的首地址引用賦值給那個變量。而原來的對象不受任何影響,如果原來的對象沒有被引用,那麼在適當的時候會被垃圾回收器回收。
針對String的“+”和“+=”操作符,是Java中唯一被重載的操作符。在Java中,不允許程序員重載操作符。
在Java中,如果想要讓一個對象所佔據的內存成爲垃圾內存,可以將對象設置爲null,切斷他們的引用關係。
StringBuffer和StringBuilder是可變的字符串序列。StringBuffer是線程安全的,而StringBuilder不是線程安全的。
字符串常量(如: String str = "hello";)實際上是一種特殊的匿名String對象,每次使用字符串常量的時候,如果內存中已經存在具有相同內容的匿名String對象,java虛擬機就不再創建一個新的匿名String對象,而是讓所有內容相同的字符串常量共享同一個匿名String對象。
從而就可以讓多個內容相同的引用變量指向同一個匿名String對象,這樣就可以節約內存空間。
在windows系統下,按回車會產生兩個字符“\r\n”。
變量:內存中的一個存儲區域
該區域有自己的名稱(變量名)和類型(數據類型)
該區域的數據可以在同一類型範圍內不斷變化。
5 運算符
算術運算符(*/%,+-),位運算符,比較運算符(<><=>=,==!=),邏輯運算符(&,^,|,&&,||),賦值運算符。(優先級從高到底)
移位運算的注意事項及小技巧:
移位運算符適用類型有byte、short、char、int、long
boolean和String型不能強轉爲int型.int x=(int)true;編譯報錯。但char型可以。
對低於int型的操作數將先自動轉換爲int型再移位。
對於int型整數移位a>>b,系統先將b對32取模,得到的結果纔是真正移位的位數。例如:a>>33和a>>1結果是一樣的,a>>32的結果還是a原來的數字。
對於long型整數移位時a>>b ,則是先將移位位數b對64取模。
在做int型移位運算時.當所以移位數大於等於32時,系統會先用這個位數對32進行取模.如題.先取模---即32%32=0,所以a>>32相當於a>>0.還是本身.
同理對long型,當移位數大於等於64時,就要先對64取模.
移位不會改變變量本身的值。如a>>1;在一行語句中單獨存在,毫無意義 。
x>>1的結果和x/2的結果是一樣的,x<<2和x*4的結果也是一樣的。
總之,一個數左移n位,就是等於這個數乘以2的n次方,一個數右移n位,就是等於這個數除以2的n次方。
請思考:如何用程序實現求2的x次方。答案:y = 1 << x;
三元運算符
z = (x>y)?x:y;
6 語句
switch語句
格式:
switch(表達式)
{
case 取值1:
執行語句;
break;
case 取值2:
執行語句;
break;
…...
default:
執行語句;
break;
}
switch語句判斷條件可接受int, byte, char, short型,不可以接受其他類型。 寫switch語句的時候,一定要記住break;的編寫。如果一個case語句後面沒有break語句則它後面沒有匹配的case語句也會被執行。
while() {
//dosomething;
} //注意,這裏不需要分號結束。
do {
//dosomething;
} while(表達式); //注意,這裏需要有分號結束語句。
continue語句只能出現在循環語句while,do,for的子語句塊中,無標號的continue語句的作用是跳過當前循環的剩餘語句,接着執行下一次循環。
public static void main(String argv[]){
int i;
int j;
outer: for (i = 1; i < 3; i++)
inner: for(j = 1; j < 3; j++) {
if (j == 2)
continue outer;
System.out.println
("Value for i = " +i + " Value for j = " +j);
}
}
}
輸出:Value for i = 1 value for j = 1
Value for i = 2 value for j = 1
7 函數
函數就是定義在類中的具有特定功能的一段獨立小程序。
函數也稱爲方法。在同一個類中國允許同時存在一個以上的同名函數,只要他們的參數個數或類型不同即可,這種情況下該函數就叫被重載。
在C,C++,Java中,一對大括號中間的部分就是一個代碼塊,代碼塊決定其中定義的變量的作用域。代碼塊決定了變量的作用域,作用域決定了變量的可見性和存在時間。
C和C++中,{{}} ,外括號和內括號中可以定義名字相同的變量,只是不屬於同一個變量,但java不允許。
在一個函數或函數裏面的代碼塊中定義的變量稱爲局部變量,局部變量在函數或代碼塊被執行時創建,在函數或代碼塊結束時被銷燬。局部變量在進行取值操作前必須被初始化或進行過賦值操作,否則編譯出錯。
如:
public class Test{
public static void main(String [] args)
{
int x;//應改爲int x=0;
x=x+1;
System.out.println("x is "+x);
}
}
3.關於函數的返回值void
比如一個打印字符串的函數,不用返回任何結果,name就用void作爲返回值類型,意思是”不知道是什麼類型,可定義函數時又非要填寫一個返回值類型,就用它充數吧“。8 數組
同一種類型數據的集合。其實數組就是一個容器。
定義數組的方法以及靜態初始化方法:
①int x[]=new int[100];(可以用x=null將數組x不指向任何數組對象。) int ix[]={1,2,3,4};
②int 【】x; x=new int[100];(注意:int [] x;中方括號位於變量名之前) int is[]=new int[]{1,2,3,4}
java中無論用任何方式定義數組都不能指定其長度。如:int a[5];是錯誤的。
多維數組定義:
① int xx[][];
②int [][] xx; xx=new int[3][];
③int xx[][]=new int [2][3];數組對象正好是一個x*y形式的規則矩陣。
④int [] [] xx={{3,2,4},{1,5},{6}};
⑤int [] x[]=new int[10][10];相當於x[]是一個普通字符。
數組中常見兩個錯誤:空指針NullPointerException異常和數組越界ArrayIndexOutBoundsException異常。
數組引用對象的length屬性可以返回數組的長度,但注意與js中區別,不是用length()方法。
內存結構:
棧內存
用於存儲局部變量,當數據使用完,所佔空間會自動釋放。
堆內存
數組和對象,通過new建立的實例都存放在堆內存中。
每一個實體都有內存地址值。
實體中的變量都有默認初始化值。用new int【100】產生的數組對象中的每個元素的初始值都是0.
實體不在被使用,會在不確定的時間內被垃圾回收器回收。