第三個七天內容知識記錄

1.代碼塊
作用:用來初始化類、對象
代碼塊只能用static修飾,

靜態代碼塊隨着類的加載而執行(且只執行一次)
作用:

非靜態代碼塊隨着類的創建而執行
作用:在對象創建時對對象屬性進行初始化

靜態代碼塊執行優於非靜態代碼塊

靜態代碼塊中只能調用靜態的屬性和方法;非靜態代碼塊中可以調用靜態和非靜態的屬性和方法

靜態代碼塊中的內容是優於main方法中的執行,靜態代碼塊是先執行父類中的靜態代碼塊,再執行子類中的靜態代碼塊,然後執行main方法中的操作

2.final
被final修飾的類不能夠被繼承;被final修飾的方法不能夠被重寫;被final修飾的變量不能被修改,變爲一個常量

3.abstract
被abstract修飾的類不能夠被實例化,抽象類中仍然需要構造器
被abstract修飾的方法沒有方法體,只有聲明,是用來給子類重寫用的
抽象方法只能夠聲明在抽象類中
子類繼承了父類中如果有抽象方法,要麼重寫所有抽象方法(包括所有父類裏聲明的抽象方法),要麼子類聲明爲抽象類

注意:abstract不能修飾static的、private的、final的

4.抽象類的匿名子類

public class Demo {

	public static void main(String[] args) {
		
		Person p = new Person() {

			@Override
			public void eat() {
			}
			
		};
		
	}

}

abstract class Person{
	abstract public void eat();
}

匿名子類的匿名對象

public class Demo {

	public static void main(String[] args) {
		
		method(new Person(){

			@Override
			public void eat() {
				// TODO Auto-generated method stub
				
			}
			
		})
		
	}
	
	public static void method(Person p) {
		
	}

}

abstract class Person{
	abstract public void eat();
}

5.模板方法的設計模式
將一個模板中不確定的部分抽象化,交由子類完成

abstract class Person{
	
	public void spendTime() {
		long start = System.currentTimeMillis();
		
		code();
		
		long end = System.currentTimeMillis();
	}
	
	abstract public void code();
	
}

6.interface
接口中的定義:

JDK7及以前的版本:只能定義全局常量和抽象方法
全局常量的定義:public static final(書寫時可以省略)
抽象方法的定義:public abstract(書寫時可以省略)

JDK8及以後的版本:除了全局常量和抽象方法,還能夠定義靜態方法和默認方法
①接口中定義的靜態方法只能夠通過接口來調用
②通過實現類的對象可以調用接口中的默認方法,如果實現類中重寫了接口中的方法,實現類的對象調用時是調用的重寫的方法
③如果一個類同時繼承了父類和一個接口,並且父類和接口中都含有同名同參數的方法,子類在沒有重寫該方法的前提下,默認調用的是父類的方法(類優先原則)
④如果一個類實現了多個接口,並且這些接口中都定義了同名同參數的方法
⑤在子類中調用父類和接口中同名同參數的方法

class OldClass{
	
	public void method1() {
		System.out.println("OldClass-method1");
	}
	
}

interface SuperClass{
	
	public static void method() {
		System.out.println("SuperClass-method");
	}
	
	public default void method1() {
		System.out.println("SuperClass-method1");
	}
	
}

class SubClass extends OldClass implements SuperClass{
	
	@Override
	public void method1() {
		System.out.println("SubClass-method1");
	}
	
	public void myMethod() {
		//調用父類中的方法
		super.method1();
		//調用接口中的默認方法
		SuperClass.super.method1();
	}
	
}

如果一個類同時繼承了父類和實現了接口,先寫繼承後寫實現,實現類在沒有重寫該方法的前提下,會報錯(接口衝突)

class AA extends BB interface CC,DD,EE{}

7.代理模式

public class NetWorkTest {

	public static void main(String[] args) {
		
		Server server = new Server();
		ProxyServer proxyServer = new ProxyServer(server);
		
		proxyServer.browse();

	}

}

interface NetWork{
	
	public void browse();
	
}

//被代理類
class Server implements NetWork{

	@Override
	public void browse() {
		System.out.println("真實的服務器訪問網絡");
	}
	
}

//代理類
class ProxyServer implements NetWork{

	private NetWork work;
	
	public ProxyServer(NetWork work) {
		this.work = work;
	}
	
	public void check() {
		System.out.println("聯網之前的檢查工作");
	}
	
	@Override
	public void browse() {
		check();
		
		work.browse();
	}
	
}

應用場景:安全代理;遠程代理;延遲加載

8.工廠模式

簡單工廠模式/靜態工廠模式:將創建者和調用者分離,單獨的放入到一個類中
弊端:如果新增加產品,就需要增加代碼,違反了開閉原則(對擴展開放,對修改封閉)

工廠方法模式:

抽象工廠模式:

9.內部類
成員內部類(靜態、非靜態)
局部內部類(方法內、代碼塊內、構造器內)

實例化成員內部類的對象
在成員內部類中區分調用外部類的結構

public class TestDemo {

	public static void main(String[] args) {
		
		//創建Dog實例(靜態內部類)
		Creature.Dog dog = new Creature.Dog();
		dog.show();
		
		//創建Cat實例(非靜態內部類)
		Creature c = new Creature();
		Creature.Cat cat = c.new Cat();
		cat.display("變量");
	}
	
	
}

class Creature{
	
	String name = "外部類";
	int age;
	
	public void eat() {
		System.out.println("dog eat bones");
	}
	
	static class Dog{
		String name;
		int age;
		
		public void show() {
			System.out.println("dog show");
		}
	}
	
	public class Cat{
		String name = "內部類";
		int age;
		
		public void display(String name) {
			System.out.println(name);
			System.out.println(this.name);
			System.out.println(Creature.this.name);
		}
	}
}

10.局部內部類和成員內部類在編譯後都會生成字節碼文件

11.異常
編譯異常:
|------IOException
|---------------FileNotFoundException
|------ClassNotFoundException
運行異常:
|------NullPointerException(空指針異常)
|------ArrayIndexOutOfBoundException(數組角標越界異常)
|------ClassCastException(類型轉換異常)
|------NumberFormatException(數字格式異常)
|------InputMismatchException(輸入不匹配異常)
|------ArithmetException(算數異常)

finally中聲明的是一定會被執行的代碼,即使catch中也出現異常了也會執行。
finally中存放的代碼:數據庫連接、輸入輸出流網絡編程Socket等資源的釋放

try-catch通常是包含的編譯時異常,運行時異常不放在try中,編譯時異常在try-catch中會變爲運行時異常

子類拋出的異常不能夠大於父類的異常類型,否則會出現漏洞

手動拋出異常

public class TestDemo {

	public static void main(String[] args) {
	
		Student student = new Student();
		student.register(-1001);
		System.out.println(s);
	
	}
	
}

class Student{
	
	private int id;
	
	public void register(int id) {
		if(id > 0) {
			this.id = id;
		}else {
			//手動拋出異常
			throw new RuntimeException("您輸入的數據非法!");
		}
	}
	
	public void set(int id) throws Exception {
		if(id > 0) {
			this.id = id;
		}else {
			//手動拋出異常
			throw new Exception("您輸入的數據非法!");
		}
	}
}

用戶自定義異常
①繼承於現有的異常結構:RuntimeException、Exception
②提供全局常量serialVersionUID

public class myException extends RuntimeException {

	static final long serialVersionUID = -7034897190745766939L;
	
	public myException() {
		
	}
	
	public myException(String msg) {
		super(msg);
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章