006-面向?qū)ο?繼承,方法重寫,訪問修飾符詳解,final,多態(tài),抽象類,接口,圖書管理系統(tǒng)

面向?qū)ο?/h1>
面向?qū)ο笫且环N思想

面向過程    注重的是“步驟”

面向?qū)ο?   注重的是“對(duì)象”

對(duì)象

對(duì)象:具有明確的屬性和行為(功能)的實(shí)體

貓類、狗類、人類
類:是一組具有相同屬性和行為的對(duì)象的集合

        屬性                      行為

人    姓名焕妙、性別一膨、年齡、身高        唱歌、跳、rap、打籃球

車     顏色芋齿、品牌腥寇、價(jià)格、輪子個(gè)數(shù)       載人觅捆、加速赦役、減速....

貓    年齡、性別栅炒、姓名掂摔、品種、顏色      喵喵赢赊、找老鼠乙漓、上樹......


類有兩個(gè)組成部分:
1、屬性   ------->  成員變量
2释移、行為   ------->  成員方法

類和對(duì)象的關(guān)系

1叭披、對(duì)象是具體的,類是抽象的
2玩讳、面向?qū)ο缶褪? 從具體到抽象趋观,從抽象到具體的過程

如何創(chuàng)建類

1、確定類名
2锋边、成員變量
3、成員方法

Student類

public class Student {
    //屬性=====成員變量  (寫在類的里面编曼,方法的外面的變量)
    String name; //姓名
    int  age;//年齡
    double height;//身高
    char sex ;//性別
    String address;//住址

    //行為=====成員方法
    public  void study() {
        System.out.println(name+"學(xué)習(xí)~~~~~~~~~~~");
    }

    public void sleep() {
        System.out.println("睡覺~~~~~~~~~~");
    }

}

如何創(chuàng)建對(duì)象

1豆巨、創(chuàng)建對(duì)象
類名  變量名(對(duì)象名) = new 類名();

2、通過對(duì)象去調(diào)用類的屬性
對(duì)象名.屬性名

3掐场、通過對(duì)象去調(diào)用類的方法
對(duì)象名.方法名()



要想調(diào)用一個(gè)類的方法和屬性往扔,必須要先要?jiǎng)?chuàng)建這個(gè)類的對(duì)象

測試類

public class Test {
    public static void main(String[] args) {
        //創(chuàng)建Student對(duì)象  類名  變量名(對(duì)象名) = new 類名();
        Student stu  = new Student();

        //調(diào)用對(duì)象的屬性(成員變量)   存值 
        //屬性的功能   存值   取值
        stu.name = "cxk";
        stu.age = 30;
        stu.sex = '男';
        stu.height = 180;
        stu.address = "武漢";

        //調(diào)用對(duì)象的屬性    取值
        System.out.println("姓名為:"+stu.name);
        System.out.println("年齡為:"+stu.age);

        //調(diào)用對(duì)象的方法   對(duì)象名.方法名();
        stu.study();
    }
}

成員變量和局部變量

區(qū)別:
1、定義的變量位置不同
    a熊户、定義在類中萍膛,方法外的變量稱之為成員變量
    b、定義在方法中的變量稱之為局部變量
2嚷堡、作用域不相同(本類)
    a蝗罗、成員變量,在整個(gè)類中都能被訪問
    b蝌戒、局部變量串塑,只能在變量所在大{}中被使用
3、初始值(默認(rèn)值)不同
    a北苟、成員變量桩匪,系統(tǒng)會(huì)賦予默認(rèn)值
    b、局部變量友鼻,沒有默認(rèn)值(所以要注意:局部變量必須要賦值才能使用)
4傻昙、重名問題
    a闺骚、成員變量不能重名
    b、局部變量可以在不同的作用域中定義重名變量
5妆档、就近原則
    當(dāng)成員變量和局部變量名相同的時(shí)候僻爽,使用的時(shí)候采用就近原則

6、生命周期不同
    a过吻、成員變量  是隨著對(duì)象在堆內(nèi)存中进泼,對(duì)象被銷毀,成員變量被銷毀
    b纤虽、局部變量  因?yàn)榫植孔兞吭跅?nèi)存中乳绕,當(dāng)方法執(zhí)行完成之后,就會(huì)被銷毀

測試

1逼纸、設(shè)計(jì)個(gè)圖形類洋措,設(shè)計(jì)兩個(gè)方法,一個(gè)求周長(返回周長)杰刽,一個(gè)球面積(返回面積)

  • 代碼實(shí)現(xiàn)
public class Rectangle {
    //成員變量
    double length;
    double width;

    //成員方法
    public double area() {
        return length *width;
    }
    public double perimeter() {
        return (length + width )*2;
    }
}

public class Test {
    public static void main(String[] args) {
        //1菠发、創(chuàng)建Rectangle對(duì)象
        Rectangle r = new Rectangle();

        //2、給對(duì)象的屬性賦值 (調(diào)用對(duì)象的屬性)
        r.length = 30;
        r.width = 20;

        //3贺嫂、求面積和周長       (調(diào)用對(duì)象的方法)
        double mj = r.area();
        System.out.println("面積為"+mj);
        double zc = r.perimeter();
        System.out.println("周長為"+zc);
    }
}

面向?qū)ο缶幊?OOP)

封裝滓鸠、繼承、多態(tài)

封裝

面向?qū)ο笾械姆庋b
隱藏類的實(shí)現(xiàn)細(xì)節(jié)第喳,對(duì)外提供公共的方法糜俗。
1、私有化屬性
2曲饱、對(duì)外提供公共的方法       setter/getter
private   私有的   只能在本類中使用

代碼演示

public class Dog {
    private String name;
    private int age;
    private char sex;

    //alt + shift + s  ------- >  getters/setters

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public char getSex() {
        return sex;
    }
    public void setSex(char sex) {
        this.sex = sex;
    }
}

this關(guān)鍵字

this關(guān)鍵字的含義是:當(dāng)前類的對(duì)象
this關(guān)鍵字的用法

調(diào)用屬性
    this.屬性名

調(diào)用方法
    this.方法()

調(diào)用構(gòu)造方法(使用的很少)
    this();
    this(構(gòu)造參數(shù)悠抹。。扩淀。楔敌。);
    注意:調(diào)用類的構(gòu)造方法,要方法第一行代碼

當(dāng)如果沒有變量名沖突的時(shí)候驻谆,this關(guān)鍵字是可以省略的卵凑。

構(gòu)造方法

構(gòu)造方法就是創(chuàng)建對(duì)象的方法
構(gòu)造方法
    語法:
    訪問修飾符 方法名(){

    }
    訪問修飾符:public
    方法名:必須與類名一致(區(qū)分大小寫)
    ()  :構(gòu)造參數(shù)列表

如果一個(gè)類沒有定義構(gòu)造方法,那么系統(tǒng)會(huì)默認(rèn)給這個(gè)類提供一個(gè)無參構(gòu)造方法
如果這個(gè)類定義了構(gòu)造方法胜臊,那么系統(tǒng)不再提供無參構(gòu)造

繼承

為什么要繼承

為了解決代碼的重用性

如何繼承

1氛谜、編寫父類
2、編寫子類
3区端、讓子類繼承自父類

繼承的語法:
public class 子類 extends 父類{


}

繼承之后特點(diǎn)(好處)

1值漫、子類繼承父類,那么子類可以享有父類的非私有屬性和方法
2织盼、子類也可以有自己獨(dú)有的屬性和方法
3杨何、在java中只支持單繼承(一個(gè)父類可以有多個(gè)子類酱塔,但是一個(gè)子類只能有一個(gè)父類),可以多層繼承
4危虱、在java中最頂端的類叫做 Object類羊娃,  在java中如果一個(gè)類沒有繼承任何的父類,那么默認(rèn)繼承自O(shè)bject類

父類和子類之間的關(guān)系

在程序中
被繼承的類   稱之為   父類埃跷、超類蕊玷、基類
繼承類      稱之為    子類、派生類

子類  is   a   父類

子類的創(chuàng)建過程

子類在創(chuàng)建對(duì)象的時(shí)候弥雹,會(huì)先去創(chuàng)建父類的對(duì)象

如果在父類中加入一個(gè)有參構(gòu)造垃帅,那么子類就會(huì)報(bào)錯(cuò)
原因:因?yàn)楦割愔杏辛擞袇?gòu)造,那么系統(tǒng)不會(huì)去提供無參構(gòu)造剪勿,子類在創(chuàng)建的是贸诚,默認(rèn)又去調(diào)用了父類的無參構(gòu)造

創(chuàng)建對(duì)象的同時(shí)對(duì)屬性進(jìn)行賦值

在子類中創(chuàng)建有參的構(gòu)造方法
public Student(String name,int age) {
    //調(diào)用父類的構(gòu)造方法
    super(name,age);
}
在父類中創(chuàng)建有參構(gòu)造
public Person(String name,int age) {
    this.name = name;
    this.age = age;
}

super關(guān)鍵字

super  表示直接父類對(duì)象

super  關(guān)鍵字的作用
    調(diào)用父類的屬性、方法厕吉、構(gòu)造方法

    調(diào)用父類的屬性:super.屬性名
               如果字類中沒有這個(gè)屬性酱固,那么調(diào)用的是父類的屬性
               那么使用this.屬性名、super.屬性名头朱,表示都是一樣的
    調(diào)用父類方法: super.方法名
                如果子類中沒有這個(gè)方法运悲,那么調(diào)用的是父類的方法
                如果子類中有相同的名字的方法(方法的重寫)
    調(diào)用父類的構(gòu)造方法: super(構(gòu)造方法)

    必須要寫在構(gòu)造方法的第一行代碼

方法重寫

在子類中出現(xiàn)與父類有相同簽名的方法,就叫做方法的重寫

重寫的要求:
    重寫的方法  方法名项钮、返回值類型班眯、參數(shù)列表要一致,訪問修飾符要比父類的大


父類Person中work方法
public void work() {
    System.out.println("這是父類的work方法");
}
在子類中重寫父類的work方法

    @Override
    public void work() {
        //super.work();
        System.out.println("喝水");
        System.out.println("抽根煙");
        System.out.println("工作");
        System.out.println("看看時(shí)間");
        System.out.println("下班");
    }    


@Override    注解      檢測這個(gè)方法是否方法重寫

方法重寫與方法重載的區(qū)別

類型 位置 方法名 返回值 參數(shù)列表 訪問修飾符
方法重寫 子類 相同 相同 相同 比父類大
方法重載 本類 相同 無關(guān) 不同 無關(guān)

訪問修飾符

類型 本類 本包 不同包子類 所有
private
默認(rèn)的
protected
public

static關(guān)鍵字

static   靜態(tài)的
修飾符:   屬性寄纵、方法、代碼塊脖苏、內(nèi)部類

    static修飾的屬性:  靜態(tài)變量
    1程拭、靜態(tài)變量直接通過類名.變量名調(diào)用,不需要?jiǎng)?chuàng)建類的對(duì)象
    2棍潘、靜態(tài)變量也可以通過對(duì)象來調(diào)用恃鞋,是因?yàn)樗诙褍?nèi)存中有一份拷貝
    3、靜態(tài)變量在對(duì)象之間是共享

    在開發(fā)中亦歉,靜態(tài)的變量用的很少恤浪。但是靜態(tài)常量用的多
    public static final 類型  常量名 = 值:
    常量:
        常量不能改變
        常量必須要賦值

    static修飾的方法:  靜態(tài)方法
    1、靜態(tài)方法直接通過類名.方法名調(diào)用肴楷,不需要?jiǎng)?chuàng)建類的對(duì)象
    2水由、靜態(tài)方法也可以通過對(duì)象來調(diào)用,是因?yàn)樗诙褍?nèi)存中有一份拷貝
    3赛蔫、靜態(tài)方法只能訪問靜態(tài)的變量和靜態(tài)方法
    4砂客、靜態(tài)方法中不能使用this和super關(guān)鍵字    

    注意:非靜態(tài)方法可以調(diào)用靜態(tài)方法

    static修飾的代碼塊  靜態(tài)代碼塊
    1泥张、當(dāng)類被加載的時(shí)候,靜態(tài)代碼塊就會(huì)被執(zhí)行
    2鞠值、靜態(tài)代碼塊只會(huì)被加載一次
    3媚创、靜態(tài)代碼塊,優(yōu)先于類的所有信息先執(zhí)行

final關(guān)鍵字

final關(guān)鍵字
    修飾屬性    常量
    1彤恶、常量一旦定義不能修改
    2钞钙、必須要賦值
    如:public static final String USERNAME= "root";        
    修飾方法    
    1、final修飾的方法不能被重寫    
    修飾類
    1声离、final修飾的類不能被繼承

注意: 靜態(tài)方法不能被重寫

多態(tài)

生活中的多態(tài):同一個(gè)事物在不同環(huán)境下有不同的狀態(tài)
人在不同的環(huán)境下身份不同
f1鍵在不同的軟件下作用不同

程序中的多態(tài):同一個(gè)對(duì)象在不同的環(huán)境下調(diào)用芒炼,功能不同

多態(tài)產(chǎn)生的條件

1、必須要有繼承
2抵恋、父類的引用指向子類的對(duì)象(向上轉(zhuǎn)型)
3焕议、一定要有方法的重寫

多態(tài)的特點(diǎn)

1、如果發(fā)生了多態(tài)弧关,那么調(diào)用方法一定是子類重寫的那個(gè)方法
2盅安、如果發(fā)生了多態(tài),那么父類引用無法調(diào)用子類自己的方法
    如果想要調(diào)用世囊,那么就必須發(fā)生  向下轉(zhuǎn)型  
    在發(fā)生向下轉(zhuǎn)型之前别瞭,必須要發(fā)生向上轉(zhuǎn)型。否則會(huì)有異常java.lang.ClassCastException(類轉(zhuǎn)換異常)
3株憾、如何避免程序出現(xiàn)類轉(zhuǎn)換異常
    在轉(zhuǎn)換之前蝙寨,先判斷是都是這個(gè)類型
    //判斷對(duì)象是否是某一個(gè)類型
    //判斷animal是否是Dog類型
    if(animal instanceof Dog) {
        Dog d = (Dog)animal;
        d.show();
    }

4、編譯看左邊嗤瞎,   運(yùn)行看右邊

抽象類

用abstract關(guān)鍵字修飾的類就稱之為抽象類

抽象類的特點(diǎn):   abstract關(guān)鍵字修飾
        1墙歪、有抽象方法的類必須是抽象類
        2、抽象類也可以沒有抽象方法(沒什么意義)
        3贝奇、抽象類不能被實(shí)例化

抽象類的作用   當(dāng)?shù)?  一般都是用來作為父類被使用

抽象方法的特點(diǎn):  abstract關(guān)鍵字修飾
        1虹菲、抽象方法不能有方法體(不同有{})
        2、抽象方法必須被子類重寫掉瞳,除非自己也是一個(gè)抽象類

接口

生活中的接口:接口定義了規(guī)范毕源,是一種約束

public class 類名{
    成員變量
    成員方法
}
如何定義接口:
public interface 接口名{

}
接口中只能包含:
    靜態(tài)常量    默認(rèn)加上了  public static final修飾
    抽象方法    默認(rèn)加上了  public abstract修飾

如何實(shí)現(xiàn)接口
public class 實(shí)現(xiàn)類 implements 接口名{
    //重寫接口的抽象方法
}

如果使用接口  (利用多態(tài))
MyInterface mi = new MyInterfaceImpl();
mi.show();

接口的特點(diǎn):
    1、一個(gè)類可以實(shí)現(xiàn)多個(gè)接口  (類與接口之間是實(shí)現(xiàn)關(guān)系)
    2陕习、一個(gè)接口可以繼承多個(gè)接口(接口與接口之間是繼承關(guān)系)
    3霎褐、一個(gè)類只能繼承一個(gè)類

接口其實(shí)使用特殊的抽象類

接口和抽象類的區(qū)別

1、接口中必須都是抽象方法该镣,抽象中類可以沒有
2冻璃、接口中必須是靜態(tài)常量,抽象類都可以
3、接口是被類實(shí)現(xiàn)(implements)俱饿,抽象類是被繼承(extends)
4歌粥、都不能被實(shí)例化

圖書管理系統(tǒng)

  • 接口類
public interface UserInterface {
    //用戶登錄
    boolean login(User user);

    //用戶注冊
    void register(User user);

}

  • 接口實(shí)現(xiàn)類
public class UserInterfaceImpl implements UserInterface {
    //保存所有的用戶信息
    User[] users = new User[0]; 
    @Override
    public boolean login(User user) {
        //遍歷User數(shù)組中的所有用戶對(duì)象
        for (int i = 0; i < users.length; i++) {
            User u = users[i];
            if(user.getUsername().equals(u.getUsername())   && user.getPassword().equals(u.getPassword())) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void register(User user) {
        //定義長度比以前數(shù)組大1的新數(shù)組
        User[] users_1 = new User[users.length+1];        
        for (int i = 0; i < users.length; i++) {
            users_1[i] = users[i];
        }
        //將傳進(jìn)來的User存在數(shù)組的最后一個(gè)位置
        users_1[users_1.length-1] = user;        
        //將新數(shù)組賦給,成員變量的數(shù)組
        users = users_1;        
    }
}

  • User實(shí)體類
public class User {
    private String username;
    private String password;
    public User(String username, String password) {
        super();
        this.username = username;
        this.password = password;
    }
    public User() {
        super();
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
  • 菜單類
public class Menu {
    public static final int REG = 1;
    public static final int LOG = 2;
    public static final int EXIT = 3;
    //定義UserInterfaceImpl 對(duì)象拍埠,調(diào)用登錄和注冊的方法
    UserInterface userInterface = new UserInterfaceImpl();

    Scanner sc = new Scanner(System.in);    
    public void menu() {
        System.out.println("歡迎光臨XXXX系統(tǒng)");
        System.out.println("1失驶、注冊");
        System.out.println("2、登錄");
        System.out.println("3枣购、退出");
        int num = sc.nextInt();
        switch (num) {
        case Menu.REG:

            System.out.println("請輸入注冊用戶名");
            String username = sc.next();
            System.out.println("請輸入注冊密碼");
            String password = sc.next();
            User user = new User(username, password);
            userInterface.register(user);

            menu();
            break;
        case Menu.LOG:
            System.out.println("歡迎登錄");
            System.out.println("請輸入用戶名");
            String username1 = sc.next();
            System.out.println("請輸入密碼");
            String password1 = sc.next();
            User user1 = new User(username1, password1);
            boolean b = userInterface.login(user1);
            if(b == true) {
                System.out.println("進(jìn)入圖書管理系統(tǒng)~~~~");
            }else {
                System.out.println("登錄失敗嬉探,請檢查你的賬號(hào)和密碼");
            }
            menu();

            break;
        case Menu.EXIT:
            System.out.println("歡迎下次使用~~~~");
            break;

        default:
            System.out.println("您的選擇有誤~請重新輸入");
            menu();
            break;
        }
    }
}
  • 測試
public class Test {
    public static void main(String[] args) {
        Menu menu = new Menu();
        menu.menu();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棉圈,隨后出現(xiàn)的幾起案子涩堤,更是在濱河造成了極大的恐慌,老刑警劉巖分瘾,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胎围,死亡現(xiàn)場離奇詭異,居然都是意外死亡德召,警方通過查閱死者的電腦和手機(jī)白魂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來上岗,“玉大人福荸,你說我怎么就攤上這事‰戎溃” “怎么了敬锐?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呆瞻。 經(jīng)常有香客問我台夺,道長,這世上最難降的妖魔是什么痴脾? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任颤介,我火速辦了婚禮,結(jié)果婚禮上明郭,老公的妹妹穿的比我還像新娘买窟。我一直安慰自己丰泊,他們只是感情好薯定,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瞳购,像睡著了一般话侄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天年堆,我揣著相機(jī)與錄音吞杭,去河邊找鬼。 笑死变丧,一個(gè)胖子當(dāng)著我的面吹牛芽狗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播痒蓬,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼童擎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了攻晒?” 一聲冷哼從身側(cè)響起顾复,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鲁捏,沒想到半個(gè)月后芯砸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡给梅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年假丧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片破喻。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虎谢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出曹质,到底是詐尸還是另有隱情婴噩,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布羽德,位于F島的核電站几莽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宅静。R本人自食惡果不足惜章蚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姨夹。 院中可真熱鬧纤垂,春花似錦、人聲如沸磷账。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逃糟。三九已至吼鱼,卻和暖如春蓬豁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背菇肃。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工地粪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琐谤。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓蟆技,卻偏偏與公主長得像,于是被迫代替她去往敵國和親斗忌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子付魔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容