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);
}
}