JavaSEday03修飾符和內部類

day03 (修飾符、內部類)
    一.final關鍵字
        1.final的作用
            a.final修飾類
                被final修飾的類,稱爲太監類,不能被其他類繼承
            b.final修飾方法
                被final修飾的方法,不能被子類重寫!!
            c.final修飾局部變量——基本類型
                被final修飾的局部變量,只能賦值一次,被稱爲常量!!            但是可以定義的時侯同時賦值,也可以先定義後賦值
            思考:如下兩種寫法,哪種可以通過編譯?
        寫法1:
            final int c = 0;
            for(int i = 0; i < 10; i++){
                c = i; // 報錯!!因爲c是final修飾的,只能賦值一次                System.out.println(c);
            }
        寫法2:
            for (int i = 0; i < 10; i++){
                final int c =i; // 對!!每次循環都定義一個新的c,賦值一次是沒有問題的!!
                System.out.println(c);
            }
            d.final修飾引用類型的變量
                被final修飾的引用類型,只能賦值一次(表示其保存的地址值不能改變)    但是!!!可以修改地址指向的對象中的屬性值
            e.final修飾成員變量
                被final修飾的成員變量,只能賦值一次,要麼定義成員變量時直接賦值    要麼先定義後賦值,但是後賦值必須寫在構造方法中!!!
    二.static關鍵字
        1.static的含義
            static叫做靜態的,可以修飾成員變量,成員方法
            被static修飾的成員變量,稱爲靜態變量,類變量
            被static修飾的成員方法,稱爲靜態方法,類方法
            static的作用就是把成員變量或者成員方法變爲屬於類的,而不是屬於對象的!!!            通過類名就可以直接訪問或者調用!!!
        2.static修飾成員變量
            該成員變量被稱爲類變量,類變量不屬於對象,屬於整個類(屬於所有對象共享的)        內存中有一個變量,所有對象共享這同一個類變量
            在開發中,我們不建議通過對象名去訪問類變量,建議使用類名直接訪問
            內存圖詳解:
             
        3.static修飾成員方法
            被static修飾的成員方法,我們稱爲類方法
            類方法可以通過類名直接調用,而不需要通過對象調用
        4.總結static成員的用法和注意事項
            static可以修飾成員變量
                作用:a.成員變量屬於類,不屬於對象 b.可以通過類名直接調用                使用:可以通過 對象名.靜態成員變量 訪問
                    建議通過 類名.靜態成員變量 訪問
            static可以修飾成員方法
                作用:a.可以通過類名直接調用
                使用:可以通過 對象名.靜態成員方法 調用
                    建議通過 類名.靜態成員方法 調用
        靜態和非靜態之間的互相訪問問題********
            靜態與靜態可以相互訪問
            非靜態與非靜態可以相互訪問
            非靜態可以訪問靜態,靜態不能訪問非靜態
            原因:生命週期不同造成的!!!
                非靜態是隨着對象的存在而存在
                靜態隨着類的存在而存在
                    所以!!靜態出現的時機比非靜態要早!!!
        5.靜態代碼塊
            代碼塊:{代碼...}
            靜態代碼塊:static{代碼...}
            靜態代碼塊的位置:類中方法外
            靜態代碼塊的執行:靜態代碼塊不需要我們手動調用
                JVM只會在第一次使用到該類的,自動調用靜態代碼塊
            靜態代碼塊的優先級:在同一個類中,靜態代碼塊的優先級是高於構造方法的!!!也高於main方法!!!
            靜態代碼塊的應用:(目前瞭解)
                用來做一些初始化操作,比如加載數據庫驅動
                用來給靜態成員賦值,比如給數據庫連接四大要素賦值

    三.權限修飾符
        a.Java的四種權限修飾符
            Java中四大權限,從大到小依次爲:
        public   protected   不寫(default)  private
同一個類中    ok       ok          ok               ok
同包不同類中  ok       ok          ok               no
不同包的子類中 ok      ok          no               no
不同包其他類中 ok      no          no               no
        
        b.我們開發中用到的權限
            一般來說 成員變量 使用private
            一般來說 成員方法 使用public

    四.內部類
        1.什麼是內部類(嵌套類)
            一個類A,其內部還有一個類B,此時類B稱爲內部類,類A稱爲外部類
            根據內部類的定義位置不同,內部類可以分爲
            成員內部類
            局部內部類

        2.成員內部類
            內部類定義類中方法外
//外部類
public class OuterClass {
    int a;
    String b;
    //成員內部類
    public class InnerClass1{
        int age;
        String name;
        public void eat() {
            System.out.println(age+","+name);
        }
    }

    public void show() {
        int c = 10;
    }
}
內部類對象如何創建:
//Java規定,創建內部類對象的格式
//外部類名.內部類名 對象名 = new 外部類名().new 內部類名();
OuterClass.InnerClass1 ic1 = new OuterClass().new InnerClass1();
OuterClass.InnerClass1 ic2 = oc.new InnerClass1();

        3.擴展:局部內部類
            內部類定義在類中方法中
//外部類
public class OuterClass {
    int a;
    String b;
    public void show() {
        int c = 10;
        //局部內部類
        class InnerClass2{
            int age;
            String name;
            public void show() {
                System.out.println(age+","+name);
            }
        }
    }
}
內部類對象如何創建:
public void show() {
    int c = 10;
    //局部內部類
    class InnerClass2{
        int age;
        String name;
        public void show() {
            System.out.println(age+","+name);
        }
    }
    //局部內部類只能在所定義的方法中使用
    InnerClass2 ic2 = new InnerClass2();
    System.out.println(ic2.age);
    System.out.println(ic2.name);
    ic2.show();
}
內部類的特點是:內部類中可以無條件訪問外部類中的任何成員!!!

        4.[重點]匿名內部類*******************
            匿名內部類:是一種語法糖,簡便格式,但是原理不變
            匿名內部類是一種創建抽象類的子類對象和接口的實現類對象的簡便格式!!!
public class TestDemo {
    public static void main(String[] args) {
        //創建子類對象
        Dog dd = new Dog();
        dd.eat();
        dd.sleep();
        //使用匿名內部類
        Animal d = new Animal(){
            @Override
            public void eat() {
                System.out.println("狗狗吃shi..");
            }

            @Override
            public void sleep() {
                System.out.println("狗狗趴着睡...");
            }
        };
        d.eat();
        d.sleep();
        //創建實現類對象
        Mouse mm = new Mouse();
        mm.open();
        mm.close();
        //使用匿名內部類
        USB m = new USB(){
            @Override
            public void open() {
                System.out.println("鼠標打開了...");
            }

            @Override
            public void close() {
                System.out.println("鼠標關閉了...");
            }
        };
        m.open();
        m.close();
    }
}

五.引用類型使用總結
        引用類型和基本類型的區別:
            基本類型 都在棧中保存
            引用類型 對象名在棧中,真正的對象在堆中
        
        1.基本類型可以做的引用類型也可以做
        2.引用類型作爲方法參數和返回值
public class TestDemo {
    public static void main(String[] args) {

    }
    //基本類型作爲返回值
    public static int getNum() {
        return 10;
    }
    //引用類型作爲返回值
    public static int[] getArr() {
        int[] arr = new int[5];
        return arr;
    }
    public static Dog getDog() {
        Dog dd = new Dog();
        return dd;
    }
    //基本類型作爲參數
    public static void method01(int a) {
        System.out.println(a);
    }
    //引用類型作爲參數
    public static void method02(int[] arr) {

    }
    public static void method03(Dog d){

    }
}

3.引用類型作爲成員變量*************
/**
 * 遊戲道具:武器類
 */
public class Weapon {
    String name;
    int level;
    int attack;
    String color;
    //...
}
/**
 * 遊戲角色:戰士類
 */
public class Soldier {
    String name;
    int level;
    int hp;//血量
    int attack;//攻擊力
    //武器
    Weapon wq;
    //方法
    public void killPerson() {
        System.out.println("我叫"+name+",等級爲"+level+",血量爲"+hp+",攻擊力爲"+attack+"," +
                "拿着一把名字叫"+wq.name+",顏色爲"+wq.color+",等級爲"+wq.level+",攻擊力爲"+wq.attack+"的武器去砍人,一刀暴擊99999");
    }
}
public class TestSoldier {
    public static void main(String[] args) {
        //創建一個戰士,去砍人
        Soldier sd = new Soldier();
        sd.name = "渣渣輝";
        sd.level = 99;
        sd.hp = 10000;
        sd.attack = 1111;

        //創建一把武器
        Weapon ww = new Weapon();
        ww.name = "屠龍寶刀";
        ww.level = 200;
        ww.color = "屎黃色";
        ww.attack = 8888;

        //把武器賦值戰士
        sd.wq = ww;
        //砍人
        sd.killPerson();
    }
}

總結:
    -[] 描述final修飾的類的特點
        該類不能被繼承.final和abstract不能共存!!!
    -[] 描述final修飾的方法的特點
        該方法不能被子類重寫,final和abstract不能共存!!!
    -[] 描述final修飾的變量的特點
        該變量只能賦值一次
            對於基本類型來說 值只能賦值一次
            對於引用類型來說 地址只能賦值一次
    -[] 能夠掌握static關鍵字修飾的變量調用方法
        可以通過 
            對象名.類變量名
        建議通過
            類名.類變量名
    -[] 能夠掌握static關鍵字修飾的方法調用方式
        可以通過 
            對象名.類方法名();
        建議通過
            類名.類方法名();
    -[] 能夠寫出靜態代碼塊的格式
        static{
            代碼塊...
        }
    -[] 能夠說出權限修飾符作用範圍
        public 任何地方都可以使用
        protected 本類和本包其他類和其他包的子類可以使用
        不寫 本類和本包其他類可以使用
        private 本類可以使用
    -[] 能夠說出內部類概念
    -[] 能夠理解匿名內部類的編寫格式
        抽象類 對象名 = new 抽象類(){
            重寫抽象類中所有的抽象方法
            ...
        };
        
        接口 對象名 = new 接口(){
            重寫接口中所有的抽象方法
            ...
        };
    -[] 能夠使用引用類型作爲方法參數和返回值
    -[] 能夠使用引用類型作爲成員變量
            案例1:戰士和武器
            案例2:人和身份證


            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章