1. 程式人生 > 其它 >spring mvc環境之監聽器、過濾器、攔截器(六)

spring mvc環境之監聽器、過濾器、攔截器(六)

1.1普通方法

方法通俗點來講用於描述一個物件的行為.例如一個人可以有很多行為,吃飯睡覺打豆豆,而這些行為是由方法來實現的。

行為也被稱作方法或者函式.

程式碼示例:

class Person {
    public int age = 18;
    public String name = "張三";

    public void show() {
        System.out.println("我叫" + name + ", 今年" + age + "歲");
    }
}

class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.show();
    }
}

// 執行結果
我叫張三,今年18歲

此處的 show 方法, 表示 Person 這個物件具有一個 "展示自我" 的行為.

這樣的 show 方法是和 person 例項相關聯的. 如果建立了其他例項, 那麼 show 的行為就會發生變化

Person person2 = new Person(); person2.name = " 李 四 "; 
person2.age = 20;
person2.show()

// 執行結果
我叫李四, 今年20歲

方法中還有一種特殊的方法稱為 構造方法 (construction method)。

在例項化物件的時候會被自動呼叫到的方法, 方法名字和類名相同, 用於物件的初始化.雖然我們前面已經能將屬性就地初始化, 但是有些時候可能需要進行一些更復雜的初始化邏輯, 那麼就可以使用構造方法.後面我們會詳細介紹構造方法的語法.

1.2靜態方法

static關鍵字修飾方法,此方法稱為靜態方法,同時也成為類方法
 1.訪問方式:通過類名.靜態成員方法名(),同時需要注意的是通過物件的引用也是可以訪問靜態成員變數的,雖然在書寫時編譯器(idea)可能會報錯,但是執行時是不會報錯的。

2.特點:

靜態方法屬於類,而不屬於類的物件。

可以直接呼叫靜態方法,而無需建立類的例項。

靜態方法可以訪問靜態資料成員,並可以更改靜態資料成員的值。

程式碼示例:

class TestDemo {
    public int a;
    public static int count;

    public static void change() {
        count = 100;
        //a = 10; error	不可以訪問非靜態資料成員
    }
}

public class Main{
    public static void main(String[] args) {
        TestDemo.change();//無需建立例項物件 就可以呼叫
        System.out.println(TestDemo.count);
    }

注意事項:靜態方法和例項無關, 而是和類相關. 因此會導致幾種情況:

(1): 在靜態方法的內部是不能訪問例項成員變數的,同樣也不能呼叫例項成員方法

(2): 注意不管是靜態的方法還是非靜態的方法中都不能定義靜態的變數,但是可以定義非靜態的
       原因:因為靜態的變數屬於類並不屬於方法,也就是我們俗稱的類變數

(3):this和super兩個關鍵字不能在靜態上下文中使用(this 是當前物件的引用, super是父類物件的引用,而靜態是不依賴物件的,所以不能在靜態方法中使用this和super關鍵字).

(4):所有被static所修飾的方法或者屬性,全部不依賴於物件。

1.3構造方法

1.3.1基本語法

構造方法是一種特殊方法, 使用關鍵字new例項化新物件時會被自動呼叫, 用於完成初始化操作.

例項化物件的過程分為兩步:

1.為物件分配記憶體空間

2.呼叫合適的構造方法,合適意味著構造方法並不止一個。

語法規則

  1. 方法名稱必須與類名稱相同
  2. 每一個類中一定至少存在一個構造方法(沒有明確定義,則系統自動生成一個無參構造)
  3. 構造方法沒有返回值型別宣告

注意事項

1.如果類中沒有提供任何的建構函式,那麼編譯器會預設生成一個不帶有引數的建構函式

2.若類中定義了構造方法,則預設的無參構造將不再生成

3.構造方法支援過載. 規則和普通方法的過載一致.

4.建構函式的作用就是構造物件,同時也可以在構造物件的同時對物件的成員進行初始化

5.不同的構造方法的呼叫主要是看括號內部引數是什麼,就呼叫相對應的即可

程式碼示例:

class People {
    private String name;
    private int age;
    public String sex;
    public static int count;

    //構造方法
    People() {
        System.out.println("不帶有引數的構造方法");
    }

    People(String name) {
        System.out.println("帶有1個引數,String的構造方法!");
    }

    People(String name, int age) {
        System.out.println("帶有2個引數,String,int的構造方法!");
    }

    People(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public void print() {
        System.out.println("name=" + name + " " + "age=" + age + " " + "sex=" + sex);
    }
}

public class LeiHeDuiXiang3 {

    public static void main(String[] args) {
        //不同的構造方法的呼叫主要是看括號內部引數是什麼,就呼叫相對應的即可
        //輸出結果為 System.out.println("不帶有引數的構造方法");
        People person = new People();
        //輸出結果為 System.out.println("帶有1個引數,String的構造方法!");
        People person1 = new People("songbiao");
        //輸出結果為System.out.println("帶有2個引數,String,int的構造方法!");
        People person2 = new People("songbiao", 100);

        System.out.println("==============================================");
        //建構函式的作用就是構造物件,同時也可以在構造物件的同時對物件的成員進行初始化
        People person3 = new People("songbiao", 100, "男");
        person3.print();
    }
}

在這裡注意一個點。假若我們此時去掉People()這個任何引數的建構函式的話,當我們new People()的時候程式便會報錯,為什麼?
答:因為當我們不定義建構函式時,其實編譯器會預設給我們生成一個無引數的建構函式,而當我們定義了其他的有參的建構函式而沒有定義無引數的建構函式時,此時系統不會再預設為我們定義無引數的構造函數了,那麼當我們通過語句new People()例項化一個物件時,便找不到對應的構造函數了,那麼此時需要我們自己定義一個無引數的建構函式。

1.3.2this關鍵字(重點)

this表示當前物件引用(注意不是當前物件). 可以藉助 this 來訪問物件的欄位和方法.

在這裡講下為什麼this是物件的引用而不是物件?
答:首先來看下例項化一個物件分為幾步吧:
 第1步:為物件分配記憶體
 第2步:呼叫合適的構造方法。注意:合適二字意味著建構函式可不止一個
 this不是物件的原因是當我們完成對構造方法的呼叫後物件才會建立,而我們此時能在建構函式中去使用this,則說明this出現在物件創立之前,所以this並不是指物件
 當我們在例項化物件的時候,第一步是為物件分配記憶體,既然有了記憶體就一定有了地址,地址是存在引用當中的,所以我們說此時this指的是物件的引用。

this的三種使用方式:

1this********訪問成員變數
 2this********呼叫成員方法
 3this********呼叫構造方法:在一個方法內部呼叫另外一個構造方法

程式碼示例:

class People1 {
    private String name;
    private int age;
    public String sex;
    public static int count;

    //this呼叫構造方法
    People1() {
        /*
        注意this不能呼叫本身的建構函式,不然會陷入死迴圈
        this();
        */

        /*
        this在呼叫構造方法時只能放在第一行並且只能呼叫一次建構函式
        this在呼叫構造方法時只能用在構造方法中
        */
        this("songbiao");
        /*
        注意此時this如果想要呼叫第二個建構函式便會報錯
        this("haha",10);
         */
        System.out.println("haha");
    }

    People1(String name) {
        System.out.println("hehe");
    }

    People1(String name, int age) {
        System.out.println("heheda");
    }


    //普通成員方法
    public void eat() {
        People1 p = new People1();
        System.out.println("吃飯");
    }

    /*1.普通的成員方法中是可以使用this來訪問例項成員變數和靜態成員變數的
      2.普通的成員方法中是可以使用this來呼叫例項成員方法和靜態成員方法的

    */
    public  void print() {
        //使用this來訪問例項成員變數
        System.out.println("name=" + this.name + " " + "age=" + this.age + " " + "sex=" + sex);
        //使用this來訪問靜態成員變數,雖然不妥但是編譯時不會出錯的
        System.out.println(this.count);
        //使用this來呼叫例項成員方法
        this.eat();
        //使用this來呼叫靜態成員方法,雖然不妥但是編譯時不會出錯的
        this.func1();
        //可以直接呼叫靜態成員方法
        func1();
        //可以直接呼叫例項成員方法
        eat();
         /*
         注意不管是靜態的方法還是非靜態的方法中都不能定義靜態的變數,但是可以定義非靜態的
         原因:因為靜態的變數屬於類並不屬於方法,也就是我們俗稱的類變數
         static int a=10;(不允許)
        */
        //可以直接訪問靜態成員方法
        count++;
    }


    public static void func1() {
        int a = 10;
        System.out.println("sss");
    }

    /*
    靜態方法中是不能使用this的,原因是this代表物件的引用,而靜態是不依賴物件的
     */
    public static void func() {
        // 靜態方法中不能使用this訪問例項成員變數或者靜態成員變數
        //System.out.println(this.name);
        //System.out.println(this.count);
        //靜態方法中不能使用this呼叫例項成員方法或者靜態成員方法
        //this.print();
        //this.func1();
        //靜態方法中不能直接呼叫非靜態成員方法
        //print();
        //靜態方法中可以直接呼叫靜態成員方法
        func1();
        //靜態方法中可以直接訪問靜態成員變數
        count++;
        /*注意不管是靜態的方法還是非靜態的方法中都不能定義靜態的變數,但是可以定義非靜態的
          static int a=10;(不允許)
        //總結:靜態方法中不能訪問成員變數,同時也不能呼叫成員方法,並且不能在靜態方法中定義靜態變數
        */
        System.out.println("此方法為靜態方法");
    }
}

public class LeiHeDuiXiang4 {
    public static void main(String[] args) {
        People1 person = new People1();
        person.eat();
    }
}

下面我們來逐個分析:

1:this關鍵字可以在構造方法中使用,那麼我們來看程式碼:

 People1() {
        /*
        注意this不能呼叫本身的建構函式,不然會陷入死迴圈
        this();
        */
        /*
        this在呼叫構造方法時只能放在第一行並且只能呼叫一次建構函式
        this在呼叫構造方法時只能用在構造方法中

        */
        this("songbiao");
        /*
        注意此時this如果想要呼叫第二個建構函式便會報錯
        this("haha",10);
         */
        System.out.println("haha");
    }

1.首先我們可以使用this關鍵字在一個構造方法中去呼叫另一個構造方法,但是不能呼叫本身,這樣會陷入死迴圈。

2.this方法在呼叫當前類的其他構造方法時只能將呼叫語句放在構造方法中的第一行並且只能呼叫一次。

3.this如果想要呼叫第二個建構函式便會報錯,說明一個建構函式中只能呼叫一次其他建構函式。

2.this可以在普通成員方法中使用,下面來看程式碼:

public void print() {
        //使用this來訪問例項成員變數
        System.out.println("name=" + this.name + " " + "age=" + this.age + " " + "sex=" + sex);
        //使用this來訪問靜態成員變數,雖然不妥但是編譯時不會出錯的
        System.out.println(this.count);
        //使用this來呼叫例項成員方法
        this.eat();
        //使用this來呼叫靜態成員方法,雖然不妥但是編譯時不會出錯的
        this.func1();
        //可以直接呼叫靜態成員方法
        func1();
        //可以直接呼叫例項成員方法
        eat();
         /*
         注意不管是靜態的方法還是非靜態的方法中都不能定義靜態的變數,但是可以定義非靜態的
         原因:因為靜態的變數屬於類並不屬於方法,也就是我們俗稱的類變數
         static int a=10;(不允許)
        */
        //可以直接訪問靜態成員方法
        count++;
    }

1.在普通成員方法中可以使用this關鍵字來訪問成員變數,呼叫成員方法,雖然使用this關鍵字訪問靜態成員變數和呼叫靜態成員方法時編譯器(idea)會報錯,但是執行時是不會出錯的。

2.在普通成員方法中也可以直接訪問成員變數和成員方法。

3. this不可以在靜態成員方法中使用,下面來看程式碼:

public static void func() {
        // 靜態方法中不能使用this訪問例項成員變數或者靜態成員變數
        //System.out.println(this.name);
        //System.out.println(this.count);
        //靜態方法中不能使用this呼叫例項成員方法或者靜態成員方法
        //this.print();
        //this.func1();
        //靜態方法中不能直接呼叫非靜態成員方法
        //print();
        //靜態方法中可以直接呼叫靜態成員方法
        func1();
        /*注意不管是靜態的方法還是非靜態的方法中都不能定義靜態的變數,但是可以定義非靜態的
          static int a=10;(不允許)
        //總結:靜態方法中不能訪問成員變數,同時也不能呼叫成員方法,並且不能在靜態方法中定義靜態變數
        */
        //靜態方法中可以直接訪問靜態成員變數
        count++;
        System.out.println("此方法為靜態方法");
    }
}

此時我們會發現this不可以在靜態方法中使用,這是為什麼呢?

答:因為this代表物件的引用,而靜態是不依賴物件的。

所以在靜態成員方法中只能訪問靜態的成員變數以及呼叫靜態成員方法。

在這裡再次強調下:注意不管是靜態的方法還是非靜態的方法中都不能定義靜態的變數,但是可以定義非靜態的,因為靜態的變數屬於類並不屬於方法,也就是我們俗稱的類變數****