亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

基礎學習day07---面向對象三---繼承,接口與抽象類

2019-11-14 15:40:01
字體:
來源:轉載
供稿:網友

一、繼承

 

1.1、繼承概念

 將對象的共性抽取出來。提取出一個單獨的類。

繼承使用復用以前的代碼非常容易,能夠大大的縮短開發周期,降低開發成本,同時增加程序的易維護性

繼承使重一個類A能夠直接使用另外一個類B的屬性和方法的一種途徑

類A可以有自己的屬性和方法通過 extends 關鍵字讓類與類之間產生繼承關系。

讓類和類之間產生了關系,有了這個關系,才有了多態的特性。

注意:千萬不要為了獲取其他類的功能,簡化代碼而繼承。

必須是類與類之間有所屬關系才可以繼承,所屬關系是 is  a.的關系

 1.2、繼承的實現

類的繼承格式

java中使用extends關鍵字完成類的繼承關系,操作格式:
class 父類{} // 定義父類
class 子類 extends 父類{} // 使用extends關鍵字實現繼承
 
 1.3、繼承的特點
子類繼承父類的什么?
繼承public 和PRotected修飾的屬性和方法,不管子類和父類是不是在一個包中
繼承默認權限修飾的屬性和方法,子類和父類必須在同一個包中
注意:
JAVA只支持單繼承,也就是一個類只能繼承一個類
無法繼承private修飾的屬性和方法
無法繼承父類的構造方法
子類繼承了父類的所有屬性(包括private)和方法或子類擁有父類的所有屬性和方法是對的,只不過父類的私有屬性和方法,子類是無法直接訪問到的。即只是擁有,但是無法使用。
示例:
package com.study.day07.person;/** * 父類 * @author denny * */public class Person {    /**     * name=姓名     * age=年齡     * 都是私有的     */ private     String name;    private int age;                /**     * 無參數構造方法     */    public Person() {        System.out.println("父類無參數的構造方法");    }        /**     * 有參數構造方法     * @param name=姓名     * @param age=年齡     */    public Person(String name, int age) {            this.name = name;        this.age = age;        System.out.println("父類有參數的構造方法");    }    /**     * 顯示信息方法     */    public void show(){        System.out.println("父類show方法");        System.out.println("姓名: "+this.name+" /n年齡: "+this.age);    }    /**     * getterXxx和setterXxx方法     * @return     */    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;    }        }

子類

package com.study.day07.person;/** * 學生類繼承父類 * @author denny * */public class Student extends Person {    /**     * gender=性別     * 子類特有的屬性     */    private String gender;            /**     * 子類無參數構造方法     */    public Student() {        super();//使用父類的構造方法        System.out.println("子類無參數構造方法");    }        public Student(String name,int age,String gender) {        /*         * 調用父類有參數的構造方法         */        super(name,age);         this.gender = gender;        System.out.println("子類有參數構造方法");    }    public String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }    /**     * 重寫父類的方法     */    @Override    public void show(){        super.show(); //調用父類的方法,        System.out.println("子類show方法");        System.out.println("性別: "+this.gender); //子類自己的方法體    }        }

 測試類

package com.study.day07.person;import com.study.day07.person.Person;public class Test {    public static void main(String[] args) {        Person s=new Student("張三",20,"男");                s.show();    }}

結果:

父類有參數的構造方法子類有參數構造方法父類show方法姓名: 張三 年齡: 20子類show方法性別: 男

在子類構造函數執行時,發現父類構造函數也運行了。
原因:在子類的構造函數中,第一行有一個默認的隱式語句:super();

 

 

1.4、方法重寫

上例中子類show()實現的對父類show()方法的重寫.

 

/**     * 重寫父類的方法     */    @Override    public void show(){        super.show(); //調用父類的方法,        System.out.println("子類show方法");        System.out.println("性別: "+this.gender); //子類自己的方法體    }    

 

 

  在子類覆蓋方法中,繼續使用父類的方法可以通過super.函數名獲取 ,super.變量名

什么時候使用覆蓋操作?
當子類需要父類的功能,而功能主體子類有自己特有內容時,可以復寫父類中的方法,這樣,即沿襲了父類的功能,又定義了子類特有的內容。

 

注意:

 1、父類中的私有方法不可以被覆蓋。
 2、父類為static的方法無法覆蓋。
 3、覆蓋時,子類方法權限一定要大于等于父類方法權限。

 1.5、子類的實例化過程

 

子類中所有的構造函數默認都會訪問父類中空參數的構造函數。
    因為每一個構造函數的第一行都有一條默認的語句super();。
為什么子類實例化的時候要訪問父類中的構造函數呢?
那是因為子類繼承了父類,獲取到了父類中內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的內容進行初始化的。
注意:
 1、當父類中沒有空參數的構造函數時,子類的構造函數必須通過this或者super語句指定要訪問的構造函數。
2、子類構造函數中如果使用this調用了本類構造函數,那么默認的super(),就沒有了,因為super和this都只能定義在第一行,所以只能有一個。但是可以保證的是,子類中肯定會有其他的構造函數訪問父類的構造函數。
3、super語句必須要定義在子類構造函數的第一行!因為父類的初始化動作要先完成。
 
 總結:
    一個對象實例化過程,以Person p = new Person();為例:
    1. JVM會讀取指定的路徑下的Person.class文件,并加載進內存,并會先加載Person的父類(如果有直接的父類的情況下)。
    2. 在內存中開辟空間,并分配地址。
    3. 并在對象空間中,對對象的屬性進行默認初始化。
    4. 調用對應的構造函數進行初始化。
    5. 在構造函數中,第一行會先到調用父類中構造函數進行初始化。
    6. 父類初始化完畢后,再對子類的屬性進行顯示初始化。
    7. 再進行子類構造函數的特定初始化。
    8. 初始化完畢后,將地址值賦值給引用變量。

 

 

二、final

 

 

final可以修飾類,方法,變量。

final修飾的類不可以被繼承。
final修飾的方法不可以被覆蓋。

final修飾的變量是一個常量,只能被賦值一次。

為什么要用final修飾變量,其實,在程序中如果一個數據是固定的。那么直接使用這個數據就可以了,但是這種閱讀性差,所以應該給數據起個名稱。而且這個變量名稱的值不能變化,所以加上final固定。
寫法規范:常量所有字母都大寫,多個單詞,中間用_連接。

 

/*final 修飾的變量是常量不可更改其值*/class FinalDemo{    public static void main(String [] args){    final int x=5;    x=4;    System.out.println("x="+x);    }}

 

結果:

 

 

 

 

三、抽象類和抽象類和方法

3.1、抽象類概述

使用關鍵字abstract 來修飾

抽象定義:
 抽象就是從多個事物中將共性的、本質的內容抽取出來。
 例如:學生和老師都是人,人類就是抽象出來的共性。

 抽象類:使用abstract 修飾。
 抽象方法:Java中可以定義沒有方法體的方法,該方法的具體實現由子類完成,該方法稱為抽象方法,包含抽象方法的類就是抽象類。使用abstract來修飾

3.2、抽象類特點

抽象類和抽象方法必須用abstract關鍵字來修飾。

抽象方法只有方法聲明,沒有方法體,定義在抽象類中。
格式:修飾符 abstract 返回值類型 函數名(參數列表) ;

 抽象類不可以被實例化,也就是不可以用new創建對象。
    原因如下:
    1. 抽象類是具體事物抽取出來的,本身是不具體的,沒有對應的實例。例如:犬科是一個抽象的概念,真正存在的是狼和狗。
    2. 而且抽象類即使創建了對象,調用抽象方法也沒有意義。
    3. 抽象類通過其子類實例化,而子類需要覆蓋掉抽象類中所有的抽象方法后才可以創建對象,否則該子類也是抽象類。

示例:

 

package com.day08.abstrac.demo1;/** * 定義人類抽象類 * @author denny * */public abstract class Person {        /**     * 定義屬性     * name=姓名     * age=年齡     * gender=性別     */    private String name;    private int age;    private String gender;            /**     * 抽象方法     */    public abstract void life();  //生活方法            /**     * getter和setter方法     * @return     */    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 String getGender() {        return gender;    }    public void setGender(String gender) {        this.gender = gender;    }        }

 

子類:

package com.day08.abstrac.demo1;/** * 老師類繼承人類抽象類 * 必須實現人類中的抽象方法 * 如果不實現老師類必須是抽象類 * @author denny * */public class Teacher extends Person {    @Override    public void life() {        System.out.println("教師的生活就是教學!");    }}

3.3、抽象類相關問題

抽象類中是否有構造函數?
    答:有,用于給子類對象進行初始化。

抽象關鍵字abstract不可以和哪些關鍵字共存?

    答:private、static、final。

抽象類中可不可以沒有抽象方法?

    答:可以,但是很少見。目的就是不讓該類創建對象,AWT的適配器對象就是這種類。通常這個類中的方法有方法體,但是卻沒有內容。

3.4、抽象類和一般類的區別?

相同點:
    抽象類和一般類都是用來描述事物的,都在內部定義了成員。

區別:

  抽象類不可以被實例化,一般類可以被實例化

 抽象類可以有抽象方法和一般方法,一般類只能有一般的方法

抽象類描述事物的信息有可能不足。一般類有足夠的信息描述事物。

抽象類一定是個父類嗎?
    答:是的,因為需要子類覆蓋其方法后才可以對子類實例化。

 

 

四、接口

4.1、接口定義

當一個抽象類中的方法都是抽象的時候,這時可以將該抽象類用另一種形式定義和表示,就是接口。

    格式:interface 接口名 {}

    接口中的成員修飾符是固定的:
    成員常量:public static final   成員變量都是靜態常量
    成員函數:public abstract      所有方法都是抽象方法,可以不寫abstract,只能是public,不能是其它的

    由此得出結論,接口中的成員都是公共的權限。

    接口是對外暴露的規則。
    接口是程序的功能擴展。


    P.S.
    1、雖然接口類中的全局變量和抽象方法的修飾符都可以不用寫,但是這樣閱讀性很差。所以,最好寫上。
    2、類與類之間是繼承關系,類與接口直接是實現關系。
    3、接口不可以實例化,能由實現了接口并覆蓋了接口中所有的抽象方法的子類實例化。否則,這個子類就是一個抽象類。

4.2、接口的實現

類要實現接口要使用implements關鍵字

格式 class 類名 implements 接口名

1.實現接口時,實現接口中的所有方法

2.

 示例:

分別定義接口鳥的叫和攻擊方法都是抽象的

 

package com.day08.interfac.demo1;/** * 攻擊接口 * @author denny * */public interface BirdAttack {        /**     * 攻擊的方法     * 沒有方法體     */    public void attack();    }

 

 

package com.day08.interfac.demo1;/** * 叫聲的接口 * @author denny * */public interface BirdShout {    /**     * 叫的方法     * 沒有方法體     */    public void shout();}

 

火箭鳥

 

package com.day08.interfac.demo1;/** * 火箭鳥 * @author denny *攻擊方式:火箭攻擊 *實現了攻擊的接口和叫的接口,所有要重寫攻擊接口中的叫方法和攻擊方法 *接口可以實現多個,但繼承只能有一個 * */public class FireBird implements BirdAttack,BirdShout{    @Override    public void shout() {        System.out.println("火箭鳥喳喳叫!");    }    @Override    public void attack() {        System.out.println("火箭鳥發射火箭弾攻擊!");            }}

 

 

胖子鳥

 

package com.day08.interfac.demo1;/** * 胖子鳥 * @author denny * 叫聲:唧唧叫 * 沒有攻擊,所以不需要實現攻擊的接口 * */public class FatBird implements BirdShout {    @Override    public void shout() {        System.out.println("胖子鳥唧唧叫!");    }    }

 

 

測試類

 

package com.day08.interfac.demo1;public class BirdTest {    public static void main(String[] args) {        //創建胖子鳥對象,并調用相應的方法        FatBird fatBird=new FatBird();        fatBird.shout();        //創建火箭鳥對象,并調用相應的方法        FireBird fireBird=new FireBird();        fireBird.shout();        fireBird.attack();                    }}

 

結果

胖子鳥唧唧叫!火箭鳥喳喳叫!火箭鳥發射火箭弾攻擊!

 

以上例子中,實現的,行為和類的分離,需要哪個就實現哪個接口,沒有就不要實現

 接口的出現將“多繼承”通過另一種形式體現出來,即“多實現”。

java將多繼承機制進行改良,在java中變成了多實現,一個類可以實現多個接口。
    接口的出現避免了單繼承的局限性

4.3、抽象類和接口

相同點:

抽象類和接口都不能被實例化

都是不斷向上抽取而來的。

區別:

1. 抽象類需要被繼承(extends),而且只能單繼承。
        接口需要被實現,而且可以多實現。(implements)
 2. 抽象類中可以定義抽象方法和非抽象方法,子類繼承后,可以直接使用非抽象方法。
        接口中只能定義抽象方法,必須由子類去實現。
 3. 抽象類的繼承,是is a關系,定義該體系的基本共性內容。
        接口的實現是like a關系。  

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品亚洲一区| 久久久久国色av免费观看性色| 亚洲一区美女视频在线观看免费| 日韩中文字幕在线免费观看| 日韩av三级在线观看| 日韩免费观看视频| 久久精品成人一区二区三区| 久久综合色88| 亚洲iv一区二区三区| 久久精品国产亚洲7777| 69精品小视频| 影音先锋欧美在线资源| 国产999精品视频| 久久精品亚洲94久久精品| 日韩av高清不卡| 欧美性猛交99久久久久99按摩| 日韩电影第一页| 高清视频欧美一级| 中文综合在线观看| 国产精品黄页免费高清在线观看| 亚洲品质视频自拍网| www.日韩av.com| 亚洲理论在线a中文字幕| 久久免费少妇高潮久久精品99| 久久久久久久国产精品| 国产精品久久久久999| 国内伊人久久久久久网站视频| 久久国产精品久久精品| 国产999精品久久久| 国产免费久久av| 久热精品在线视频| 久久av中文字幕| 91精品国产网站| 97在线视频免费| 亚洲免费成人av电影| 日韩在线播放视频| 亚洲91av视频| 中文字幕9999| 欧美人与性动交| 97香蕉久久超级碰碰高清版| 51久久精品夜色国产麻豆| 精品美女国产在线| 成人免费视频xnxx.com| 亚洲国产欧美在线成人app| 日韩在线观看免费高清完整版| 在线激情影院一区| 欧美伊久线香蕉线新在线| 精品视频偷偷看在线观看| 国产精品美女主播在线观看纯欲| 欧美一乱一性一交一视频| 国产日韩欧美综合| 国内精品小视频在线观看| 狠狠久久五月精品中文字幕| 欧美尤物巨大精品爽| 久久久久成人精品| 欧美在线xxx| 红桃av永久久久| 4438全国亚洲精品在线观看视频| 日韩精品在线观看一区二区| 国产伦精品一区二区三区精品视频| 国产成人aa精品一区在线播放| 欧美性视频在线| 成人激情av在线| 亚洲精品中文字| 91精品国产91久久久久久最新| 精品国产一区二区三区四区在线观看| 色婷婷成人综合| 午夜精品一区二区三区在线视| 自拍偷拍亚洲一区| 久久久久国产精品免费网站| 国产精品日韩久久久久| 亚洲三级免费看| 91精品在线观看视频| 国产精品自在线| 久久这里有精品| 亚洲精品mp4| 国产精品亚洲网站| 亚洲第一级黄色片| 国内免费久久久久久久久久久| 日韩电影在线观看永久视频免费网站| 久久久精品欧美| 国产精品video| 久久久久北条麻妃免费看| 亚洲成人精品视频| 欧美亚洲国产成人精品| 国产精品国产三级国产专播精品人| 日本韩国欧美精品大片卡二| 成人精品网站在线观看| 亚洲精品影视在线观看| 成人激情视频网| 欧美激情免费观看| 中文字幕欧美专区| 久久影视免费观看| 欧美精品电影免费在线观看| 中文字幕亚洲欧美一区二区三区| 亚洲高清av在线| 最近2019中文字幕mv免费看| 91精品免费久久久久久久久| 久久精品男人天堂| 亚洲第一国产精品| 亚洲成年网站在线观看| 91高清免费在线观看| 亚洲欧美国产制服动漫| 精品一区二区三区四区在线| 91精品国产乱码久久久久久久久| 成人做爰www免费看视频网站| 日韩电影中文字幕av| 久久成人国产精品| 97在线观看免费高清| 亚洲成人黄色在线| 欧美激情精品久久久久久蜜臀| 久久激情五月丁香伊人| 中文字幕亚洲欧美日韩在线不卡| 欧美乱大交做爰xxxⅹ性3| 在线视频日韩精品| 日韩在线中文视频| 92国产精品视频| 一区二区成人精品| 成人网在线免费观看| 久久久人成影片一区二区三区观看| 国产激情综合五月久久| 亚洲精选在线观看| 日韩av最新在线| 久久久97精品| 国产精品99导航| 欧美激情视频三区| 欧美性视频在线| 久久久久女教师免费一区| 亚洲一区二区三区成人在线视频精品| 91午夜在线播放| 美女黄色丝袜一区| 欧美日韩性视频| 国产成人精品在线观看| 国产综合在线视频| 成人写真福利网| 欧洲日韩成人av| 热门国产精品亚洲第一区在线| 国产精品视频男人的天堂| 成人有码视频在线播放| 亚洲福利视频在线| 久久久久久久久久久亚洲| 97不卡在线视频| 久久影视电视剧免费网站清宫辞电视| 久久九九国产精品怡红院| 日韩综合中文字幕| 日韩精品视频在线| 日产精品99久久久久久| 欧美裸体xxxx极品少妇| 国产精品久久久久久久久影视| 欧美体内谢she精2性欧美| 成人精品久久av网站| 97色伦亚洲国产| 成人免费在线视频网站| 成人有码在线视频| 国产精品久久久久av免费| 国产精品一区二区久久国产| 亚洲国内精品视频| 日本aⅴ大伊香蕉精品视频| 中文字幕一区二区三区电影| 亚洲一级一级97网| 中文字幕日韩专区| 国产美女精彩久久| 久久久91精品国产一区不卡| 啪一啪鲁一鲁2019在线视频|