javaSE總結(4)
1. 子父類間異常的注意事項:
子類重寫父類方法時只能丟擲相同異常或者該異常的子類。
如果父類方法沒有丟擲異常,子類進行方法重寫時,只能通過try catch進行捕獲。
2. IO體系:
InputStream/OutputStream 位元組流的抽象類。 Reader/Writer 字元流的抽象類。
FileInputStream/FileOutputStream 節點流(操作檔案) ByteArrayInputStream/ByteArrayOutputStream 節點流
ObjectInputStream/ObjectOutputStream 處理流(操作物件)
DataInputStream/DataOutputStream(操作基本資料型別與字串)
FileReader/FileWriter 節點流(操作檔案) BufferedReader/BufferedWriter(處理流,增加快取功能,提高讀寫效率。)
BufferedInputStream/BufferedOutputStream(處理流,增加快取功能,提高讀寫效率。)
InputStreamReader/OutputStreamWriter(處理流:將位元組流物件轉化成字元流物件。)
3. 序列化:把Java物件轉換為位元組序列的過程稱為物件的序列化。
反序列化:把位元組序列恢復為Java物件的過程稱為物件的反序列化。
4. 序列化涉及的類和介面:
ObjectOutputStream代表物件輸出流,它的writeObject(Object obj)方法可對引數指定的obj物件進行序列化。
ObjectInputStream代表物件輸入流,它的readObject()方法輸入流中讀取位元組序列,再把它們反序列化為一個物件。
只有實現了Serializable介面的類的物件才能被序列化。 Serializable介面是一個空介面,只起到標記作用。
5. 物件中的某些屬性如果不想被序列化,不能使用static,而是使用transient修飾。
6. java.lang包下的包裝類:八種基本資料型別都有對應的包裝類,分別是:
Byte Short Integer Long Float Double Character Boolean
7. 包裝類的主要用途:作為和基本資料型別對應的型別存在,方便涉及到物件的操作,如Object[]、集合等的操作。
8. 如果資料在-128~127這個區間,那麼在類載入時就已經為該區間的每個數值建立了物件。
public class Test3 {
public static void main(String[] args) {
Integer in1 = -128;
Integer in2 = -128;
System.out.println(in1 == in2);//true 因為123在快取範圍內
System.out.println(in1.equals(in2));//true
Integer in3 = 1234;
Integer in4 = 1234;
System.out.println(in3 == in4);//false 因為1234不在快取範圍內
System.out.println(in3.equals(in4));//true
}
}
9. 自動裝箱呼叫的是valueOf()方法。自動拆箱呼叫的xxxValue()方法。
10. DateFormat是一個抽象類,一般使用它的的子類SimpleDateFormat類來實現時間和字串之間的轉換。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestDateFormat {
public static void main(String[] args) throws ParseException {
// new出SimpleDateFormat物件
SimpleDateFormat s1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
SimpleDateFormat s2 = new SimpleDateFormat("yyyy-MM-dd");
// 將時間物件轉換成字串
String daytime = s1.format(new Date());
System.out.println(daytime);
System.out.println(s2.format(new Date()));
System.out.println(new SimpleDateFormat("hh:mm:ss").format(new Date()));
// 將符合指定格式的字串轉成成時間物件.字串格式需要和指定格式一致。
String time = "2007-10-7";
Date date = s2.parse(time);
System.out.println("date1: " + date);
time = "2007-10-7 20:15:30";
date = s1.parse(time);
System.out.println("date2: " + date);
}
}
11. 日曆類:Calendar 類是一個抽象類,GregorianCalendar 是 Calendar 的一個具體子類。
12. 列舉:JDK1.5引入了列舉型別。列舉型別的定義包括列舉宣告和列舉體。格式如下:
enum 列舉名 {
列舉體(常量列表)
}
import java.util.Random;
public class TestEnum {
public static void main(String[] args) {
// switch語句中使用列舉
int a = new Random().nextInt(4); // 生成0,1,2,3的隨機數
switch (Season.values()[a]) {
case SPRING:
System.out.println("春天");
break;
case SUMMER:
System.out.println("夏天");
break;
case AUTUMN:
System.out.println("秋天");
break;
case WINDTER:
System.out.println("冬天");
break;
}
}
}
/**季節*/
enum Season {
SPRING, SUMMER, AUTUMN, WINDTER//列舉例項預設都是public static final修飾的。
}
13. 程序:執行中的程式叫做程序(Process),是一個動態的概念。現代的作業系統都可以同時啟動多個程序。比如:在用酷
狗聽音樂,也可以使用eclipse寫程式碼,也可以同時用瀏覽器檢視網頁。
14. 執行緒:執行緒是一個程序內部的一個執行單元,它是程式中的一個單一的順序控制流程。 一個程序可以產生多個執行緒。
15. java中實現多執行緒的兩種方式:
通過繼承Thread類實現多執行緒 :
public class TestThread extends Thread {//自定義類繼承Thread類
//run()方法裡是執行緒體
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(this.getName() + ":" + i);//getName()方法是返回執行緒名稱
}
}
public static void main(String[] args) {
TestThread thread1 = new TestThread();//建立執行緒物件
thread1.start();//啟動執行緒
TestThread thread2 = new TestThread();
thread2.start();
}
}
通過Runnable介面實現多執行緒:
public class TestThread2 implements Runnable {//自定義類實現Runnable介面;
//run()方法裡是執行緒體;
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
public static void main(String[] args) {
//建立執行緒物件,把實現了Runnable介面的物件作為引數傳入;
Thread thread1 = new Thread(new TestThread2());
thread1.start();//啟動執行緒;
Thread thread2 = new Thread(new TestThread2());
thread2.start();
}
}
16. 執行緒的五個狀態:建立 就緒 執行 阻塞 死亡
start()方法從建立狀態到就緒狀態。 獲得cpu,通過run方法進入執行狀態。 sleep(int millsecond)+wait()+join()三種方法
可使執行緒進入阻塞狀態。
17 . 終止執行緒的典型方式:
public class TestThreadCiycle implements Runnable {
String name;
boolean live = true;// 標記變數,表示執行緒是否可中止;
public TestThreadCiycle(String name) {
super();
this.name = name;
}
public void run() {
int i = 0;
//當live的值是true時,繼續執行緒體;false則結束迴圈,繼而終止執行緒體;
while (live) {
System.out.println(name + (i++));
}
}
public void terminate() {
live = false;
}
public static void main(String[] args) {
TestThreadCiycle ttc = new TestThreadCiycle("執行緒A:");
Thread t1 = new Thread(ttc);// 新生狀態
t1.start();// 就緒狀態
for (int i = 0; i < 100; i++) {
System.out.println("主執行緒" + i);
}
ttc.terminate();
System.out.println("ttc stop!");
}
}
18. sleep()方法:可以讓正在執行的執行緒進入阻塞狀態,直到休眠時間滿了,進入就緒狀態。
19. yield()方法:可以讓正在執行的執行緒直接進入就緒狀態,讓出CPU的使用權。
20. 執行緒A在執行期間,可以呼叫執行緒B的join()方法,讓執行緒B和執行緒A聯合。這樣,執行緒A就必須等待執行緒B執行完畢後,才能
繼續執行。
public class TestThreadState {
public static void main(String[] args) {
System.out.println("爸爸和兒子買菸故事");
Thread father = new Thread(new FatherThread());
father.start();
}
}
class FatherThread implements Runnable {
public void run() {
System.out.println("爸爸想抽菸,發現煙抽完了");
System.out.println("爸爸讓兒子去買包紅塔山");
Thread son = new Thread(new SonThread());
son.start();
System.out.println("爸爸等兒子買菸回來");
try {
son.join();
} catch (InterruptedException e) {
e.printStackTrace();
System.out.println("爸爸出門去找兒子跑哪去了");
// 結束JVM。如果是0則表示正常結束;如果是非0則表示非正常結束
System.exit(1);
}
System.out.println("爸爸高興的接過煙開始抽,並把零錢給了兒子");
}
}
class SonThread implements Runnable {
public void run() {
System.out.println("兒子出門去買菸");
System.out.println("兒子買菸需要10分鐘");
try {
for (int i = 1; i <= 10; i++) {
System.out.println("第" + i + "分鐘");
Thread.sleep(1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("兒子買菸回來了");
}
}