天天看點

day04-面向對象【内部類、static、包、通路修飾符、final】

1.接口

是一個比抽象類還抽像的類,使用interface關鍵詞定義。
裡面隻能定義抽象方法和常量;
不能new ,不能建立對象;

使用:
    1.定義接口的實作類:
        修飾符 calss 類名 implements 接口名{
            實作接口中所有的方法;
            }
    2.建立實作類的對象;
    3.通過實作類對象調用實作類方法;
           

2.多态

父類類型的變量隻想子類的對象;

格式:
    父類名 對象名 =new 子類名(參數清單);

    在重寫變量過着方法的情況:
        1.如果重寫了方法,通過多态通路時,通路子類中的方法;
        2.如果重寫了變量,通過多态通路變量時,通路父類的變量;
           

3.static 關鍵字

靜态的意思;
使用修飾這個類的,所有對象的共享資料的,它屬于類,不屬于某一個對象,隻有一個對象修改了這個資料,就會影響到其他對象的使用;

通路方式:
    1.通過對象名來通路:
        格式:對象名.靜态成員;
    2.靜态的通路方式:
        格式: 類名.靜态成員;

    推薦使用第二種通路方式;
           

4.靜态代碼塊

格式:
    static{
        靜态代碼;
    }
靜态代碼塊會在以任何方式第一次使用這個類時,被執行,而且是最先被執行,而且隻執行一次。

特點:
    1.優先于構造方法被執行;
    2.隻能被執行一次;
    3.靜态代碼塊優先于靜态方法被執行;
應用場景:
    通常用于初始化靜态變量,保證這些變量隻能被指派一次;
           

5.final 關鍵字

是最終的。不可修改的;
final 可以修飾類,方法,變量;
1.final修飾類:
    格式:修飾符 final class 類名{。。。};
    特點:被final修飾的類是不能被繼承的。
2.final修飾變量:
    格式:修飾符 final 傳回值類型 方法名(參數清單){
                方法體;
                renturn 傳回值;
            }
    特點:被final修飾的方法是不能被重寫的;
3.final修飾變量:
    格式: 修飾符 final 資料類型 變量名=初始值;
    特點: 被final修飾的變量的值不能被改變,其實就是常量;
           

6.包

是用來存儲class檔案的檔案夾,可以使用這些檔案夾管理你的程式檔案;
在項目中如何分包:
    先建立一個最頂層的包:
        公司域名的反寫.項目英文名稱的縮寫;
        例如: cn.itcast.oa;
1.按照功能子產品的名稱分包:


        按照功能子產品名稱建立不同的包:
            cn.itcast.oa.user
            cn.itcast.oa.email
            cn.itcast.oa.permission
            ...
2.按照程式檔案的類型分包:

        cn.itcast.oa.web
        cn.itcast.oa.service
        cn.itcast.oa.service.impl
        cn.itcast.oa.dao
        cn.itcast.oa.dao.impl
        cn.itcast.oa.utils
        ... 


推薦使用第二種方式分包;

導包:

    關鍵字import.
    當使用到的類與目前類不在同一個包下,而且不在java.lang.
           

7.通路權限修飾符

用來限制類,方法,變量的通路範圍的。

public(公共的,共用的)-protected(受保護的)-default(預設的)-private(私有的)
從左到右權限依次變小;

1.被public修飾的類,方法,變量,在任何類中都可以通路;
2.被private修飾的變量和方法隻能在本類中通路;
           

8.内部類

如果B類是定義在A類的裡面,就把B類叫做内部類;

分類:
    成員内部類;
    局部内部類;
class A{

    public String name;

    // 寫在了成員的位置
    // 成員内部類
    class B{
        B類自己的代碼;
    }

    public void method01(){
        ....
    }

    public void method02(){
        ....
        int a = 100;
        int b = 200;
        // 局部内部類
        class C{
            C類自己的代碼;
        }
    }
}
           

9.成員内部類

格式:
    class 外部類{
        成員變量;

        //寫在了成員的位置
        //成團内部類;
        class 内部類{
            内部類自己的代碼;
        }
        成員方法;
    }

使用内部類的格式:
    外部類.内部類  内部類對象=new 外部類().new 内部類();
    内部類對象.内部類的成員;

    在外部類中是把内部類作為一個成員來使用的。

    例如:
        Outer.Inner inner=new Outer().new Inner();
           

10.局部内部類

格式:
    class 外部類{
        成員變量;
        public void method(){
            内部類自己的代碼;
            }
        }
    }
由于局部内部類是定義在方法裡面的,是以它的使用範圍僅限于這個方法内部;
           

11.匿名 内部類對象

建立了一個内部類的對象,沒又給它取名字,那麼這個對象就叫匿名内部類對象;

格式:
    public class Fu{
        ....
    }
    public class test{
        ...
        public void method(){
            //通過父類的構造方法建立子類對象,然後指派給父類類型的變量:多态;
            Fu f=new Fu(){
                //重寫父類中的方法
            };
        }
    }

示例代碼:
package pack15_innerclassobject;

public class InnerObjectDemo {

public static void main(String[] args) {

    // 多态
     Fu f = new Zi();
     f.method01();

// 匿名内部類對象
// 匿名内部類對象調用結束後,會被垃圾回收期立即回收,釋放它占用的記憶體空間
            // 這樣可以節省記憶體空間
    new Fu(){
    // 重寫父類中的方法method01
    @Override
    public void method01() {
    System.out.println("--Zi-----method01------------");
            }
        }.method01();

    // 建立一個匿名内内部類對象,然後給它取個名字叫f2
        Fu f2 =new Fu(){
        // 重寫父類中的方法method01
            @Override
            public void method01() {
    System.out.println("--Zi-----method01------------");
            }
    };

    f2.method01();
    System.out.println(f2.a);

    // 相當于下面的一行代碼;
    // new Zi().method01();

System.out.println("====程式還沒有結束===========");
        }
}

匿名内部類對象的使用場景:
    在整個項目中隻有一個地方使用這個對象時,才把這個對象定義為匿名内部類對象。
           

12.練習題

1.類名座位方法參數類型或者傳回值類型

/*
     * 定義方法時,如果參數的類型為類名類型的;
     * 當調用方法時,需要給方法傳遞這個類的對象;
     */
    public static void  setPerson(Person p){
        p.age = 30;
        p.name="冬冬";

        System.out.println(p.age);
        System.out.println(p.name);
    }

    /*
     * 定義方法時,如果方法的傳回值類型為類名類型的;
     * 當給這方法傳回資料時,必須傳回這個類的對象;
     */
    public static Person getPerson(){
        Person p = new Person();
        p.age = 25;
        p.name="蓉蓉";
        return p;
    }


2.抽象類類名作為方法參數類型或者傳回值類型

3.接口名作為方法參數類型或者傳回值類型

    USB usb = new Mouse();
    public void useUSB(USB usb){
        usb.open();
    }

    public USB getUSB(){
        // USB usb = new  Mouse();
        Mouse m = new Mouse();
        return m;
    }
           

繼續閱讀