第三章Java基本語法
3.1 標準輸入輸出流
3.1.1 標準輸出輸入流
System.in:標準輸入流
System.out:標準輸出流
System.err:標準錯誤輸出流
3.1.2 標準輸出流重定位
一般的輸出會默認在命令行模式、終端機輸出,可是在執行程序時使用將輸出結果定位至指定的文件即可。
java HelloJava > HelloJavaResult.txt
3.2 基本數據類型
整形{short(2個字節)、int(4個字節)、long(8個字節)}
字節型{byte(-128~127,1個字節)}
浮點數{float(4個字節)、double(8個字節)}
字符{char(2個字節)}:Java的字符采用Unicode編碼。
3.3 邏輯和位運算
3.3.1 邏輯運算符
且(&&) 或(||) 取反(!)
3.3.2 位運算符
Java中存在4種位運算符&、|、^,分別對應數字設計上的AND(且)、OR(或)、XOR(異或)
位運算執行表
&(AND)
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
|(OR)
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
^(XOR)
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 1
~(補碼)
~運算的結果=原數取反-1,例如
~2 = -3
~0 = -1
~-2 = 1
Java中的位運算是逐位運算的
例如10010001 &01000001計算過程
10010001
& 01000001
00000001
Java對基本數據類型進行位運算是先把該數據轉換成二進制然後再逐位運算的。
例如11&12,11的二進制爲00001011,12的二進制爲00001100
00001011
& 00001100
00001000
所以11&12=8
位運算反應了Java模運算的本質,加減乘除的本質也是通過位運算來實現的。
位運算如果用的恰當,可以提高程序的運算效率,例如利用位運算判斷用戶輸入是否爲整數。
package 語法入門;
import java.util.Scanner;
public class OddDecider {
public static void main(String[] args){
Scanner input = new Scanner(System.in);
System.out.println("請輸入數字:");
int number = input.nextInt();
System.out.println("是否爲奇數?"+((number&1)!=0?"是":"否"));
}
}
奇數轉換成二進制後末位數必定爲1,偶數轉換成二進制後末位數必定爲0,1&奇數必定爲1,1&偶數必定爲0。
^運算可用於字符加密。
例如
package 語法入門;
public class XorCode {
public static void main(String[] args) {
char ch = 'A';
System.out.println("編碼前:" + ch);
ch = (char) (ch ^ 9);
System.out.println("編碼後:" + ch);
ch = (char) (ch ^ 9);
System.out.println("解碼:" + ch);
}
}
運行結果:
圖3.2.1 ^運算實現的加密
^運算可以加密原因是它可以通過一個整數來加密和解密,這個技術可用於密碼轉碼保存。
在位運算上,Java還有左移(<<)和右移(>>)兩個運算符。
左移運算會將所有的位向左移指定的位數,左邊被擠出去的位會被丟棄,而右邊會補上0;
右移運算會將所有的位向右移指定的位數,右邊被擠出去的位會被丟棄,而左邊會補上0;
上述的左移右移都是基於二進制的,如果沒有非0位被擠出去的情況下,左移相當於乘上2的指定次方,右移相當於除上2的指定次方。
第四章認識對象
4.1 簡單地使用對象
在理解對象前,你可以先試用一下,就像買衣服前你可以試穿一下。J2SE提供了很多的“試穿”的工具,這些工具在使用的時候就需要先變成你將要了解的對象。舉個簡單的例子,如果想寫一個程序取得現在的系統時間,只要產生一個java.util.Date工具就可以了。
package 語法入門;
import java.util.Date;
public class NowTime {
public static void main(String[] args){
Date date = new Date();
System.out.println(date.toString());
}
}
運行結果:
圖4.1使用Date工具
4.2 打包(Wrap)基本數據類型
在Java中基本數據類型(如int、long、double、float、boolean等)並不是對象,它們只是純粹的數據,除了數值本身的信息之外,基本數據類型都不帶有其他的信息或可操作的方法。
在J2SE 5.0之前,如果想要讓基本數據類型像對象一樣操作,即讓基本數據類型帶有其他信息和可操作的方法,那麼要使用Long、Integer、Double、Float、Boolean、Byte等類來打包基本數據類型。
例如
Int a = 10;
Integer wrappedA = new Integer(a);
a是一個基本數據類型,通過new Integer(a)方法的打包後wrapedA便是帶有一些方法的對象,例如可以使用wrappedA.doubleValue()獲取wappedA的雙精度數值。
4.3 自動裝箱(autoboxing)和拆箱(unboxing)
4.3.1 autoboxing
自動裝箱和拆箱是爲了簡便化打包基本數據類型,例如將int包裝爲一個Integer對象:
Integer a = newInteger(10);
這種打包方式可以改爲:
Integera = 10;
這種簡化的打包方式便是autoboxing。
看到這裏你會不會有這樣的疑問:爲什麼可以不用構造方法創建一個對象?
這其實是編譯器幫了你一把。在進行編譯時,編譯器再自動根據你寫下的語句,判斷是否進行自動裝箱動作。
自動裝箱運用的方法還可以如下:
int i = 10;
Integer integer = I;
也可以使用更一般化的java.lang.Number類來自動裝箱。例如:
Number number = 3.14f;
3.14f會先被自動裝箱爲Float,然後指定給number。
4.3.2 unboxing
unboxing是autoboxing的逆過程,autoboxing是將基本數據轉換成對象,但是轉換而成的對象是無法直接執行基本數據類型的運算的,這時便需要拆箱,將對象重新轉換成基本數據,例如:
Integer i = 1;
System.out.println(i+10);
System.out.println(i++);
上例中會顯示20與10,編譯器會自動進行自動裝箱與拆箱,也就是10會先被裝箱,然後在i+10時會先拆箱,進行加法運算
4.3.3 小心使用boxing
自動裝箱與拆箱的功能事實上是編譯器來幫你的忙,編譯器在編譯時期一句你所寫的語法,決定是否進行裝箱或拆箱動作。例如:
Integer i = 100;
相當於編譯器自動爲您作以下的語法編譯:
Integer i = new Integer(100);
必須得注意這個語法,不然的話很可能會出錯,比如:
Integer I = null;
Int j = I ;
這樣的語法在編譯時期是合理的,但是在運行時期會有錯誤,因爲這種語法相當於:
Integer I =null;
Int j = i.intValue;
兩個相同大小的基本數據裝箱後的對象在進行比較運算時會拆箱,例如
public class AutoBoxingDemo {
public static void main(String[]args){
Integer i1 =100;
Integer i2 =100;
if(i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
你認爲結果是什麼?