91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

黑馬程序員——面向對象篇之繼承

發布時間:2020-06-08 03:10:55 來源:網絡 閱讀:218 作者:optimisticpig 欄目:移動開發


------- android培訓、java培訓、期待與您交流! ----------

1 繼承的概述

   多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那么多個類無需再定義這些屬性和行為,只要繼承單獨的那個類即可。

   多個類可以稱為子類,單獨這個類稱為父類或者超類。

   子類可以直接訪問父類中的非私有的屬性和行為。

繼承:

   1,提高代碼的復用性。

   2,讓類與類之間產生了關系。有了這個關系,才有了多態的特征。

   注意:不要為了獲取其他類的功能,簡化代碼而繼承。必須是類與類之間有所屬關系才可以繼承,所屬關系 is a。

   java語言中:java只支持單繼承,不支持多繼承。

   因為多繼承容易帶來安全隱患:當多個父類中定義了相同功能,但功能內容不同時,子類對象不確定要運行哪一個。但是java保留了這種機制,并用另一種體現形式來完成表示:多實現。

   java支持多層繼承。也就是一個繼承體系。

   如何使用一個繼承體系中的功能呢?

       1.想要使用體系,先查閱體系父類的描述,因為父類中定義的是該體系中的共×××。

       2.通過了解共×××,就可以知道該體系的基本功能。

       那么這個體系已經可以基本使用了。

   在具體調用時,要創建最子類的對象,為什么呢?

       一是因為有可能父類不能創建對象;

       二是創建子類對象可以使用更多的功能,包括基本的也包括特有的。

       簡單一句話:查閱父類功能,創建子類對象使用功能。

class ExtendsDemo
{
    public static void main(String[] args)
    {
    }
}
class Person
{
    String name;
    int age;
}
class Student extends Person
{
    //String name;
    //int age;
    void study()
    {
        System.out.println("good good study");
    }
}
class Worker extends Person
{
    //String name;
    //int age;
    void work()
    {
        System.out.println("good good work");
    }
}


2 繼承的特點

   子父類出現后,類中成員的特點。

   類中成員:1,變量。2,函數。3,構造函數。

   1、變量

       如果子類中出現非私有的同名成員變量時,子類要訪問本類中的變量,用this。子類要訪問父類中的同名變量,用super。super的使用和this的使用幾乎一致。this代表的是本類對象的引用。super代表的是父類對象的引用。

   代碼體現:

class Fu
{
    int num = 4;
}
class Zi extends Fu
{
    int num = 5;
    void show()
    {
        System.out.println(super.num);
    }
}
class  ExtendsDemo2
{
    public static void main(String[] args)
    {
        Zi z = new Zi();
        System.out.println(z.num);
    }
}


   2,子類中的函數。

       當子類出現和父類一模一樣的函數時,子類對象調用該函數時,會運行子類函數的內容。如同父類的函數被覆蓋一樣。這種情況是函數的另一個特性:重寫(覆蓋)。當子類繼承父類,沿襲了父類的功能到子類中。但是子類雖具備該功能,但是功能的內容卻與父類不一致。這時,沒有必要定義新功能,而是使用覆蓋特性,保留父類的功能定義,并重寫功能內容。

   覆蓋:

       1,子類覆蓋父類,必須保證資料權限大于等于父類權限,才可以覆蓋,否則編譯失敗。

       2,靜態只能覆蓋靜態。

   重載:只看同名函數的參數列表。

   重寫:子父類方法要一模一樣。

   代碼體現:

class Fu
{
    void show()
    {
        System.out.println("fu show");
    }
    void speak()
    {
        System.out.println("vb");
    }
}
class Zi extends Fu
{
    void show()
    {
        System.out.println("zi show");
    }
    void speak()
    {
        System.out.println("java");
    }
}
class  ExtendsDemo3
{
    public static void main(String[] args)
    {
        Zi z = new Zi();
        z.show();
    }
}


   3,子父類中的構造函數。

       在對子類對象進行初始化時,父類的構造函數也會運行。那是因為子類的構造函數默認第一行有一條隱式的語句 super();

       super ():會訪問父類中空參數的構造函數。而且子類中所有的構造函數默認第一行都是super();


   為什么子類一定要訪問父類中的構造函數。

   因為父類中的數據子類可以直接獲取,所以子類對象在建立時,需要先查看父類是如何對這些數據進行初始化的。所有子類在對象初始化時,要先訪問一下父類中的構造函數。

   如果要訪問父類中的指定構造函數,可以通過手動定義super語句的方式來指定。

   注意:super語句一定定義在構造函數的第一行。

   子類的實例化過程。

       結論:子類的所有的構造函數,默認都會訪問父類中空參數的構造函數。因為子類每一個構造函數內的第一行都有一句隱式的super();當父類中沒有空參數的構造函數時,子類必須手動通過super語句形式來制定訪問父類中的構造函數。當然,子類的構造函數第一行也可以手動指定this語句來訪問本類中的構造函數。子類中至少會有一個構造函數會訪問父類中的構造函數。

class ExtendsDemo4
{
    public static void main(String[] args)
    {
        new Zi();
    }
}
class Fu
{
    Fu()
    {
        System.out.println("fu run");
    }
    Fu(int x)
    {
        System.out.println("fu..."+x);
    }
}
class Zi extends Fu
{
    Zi()
    {
        //super ();
        System.out.println("zi run");
    }
    Zi(int x)
    {
        this();//沒有隱式的super();
        //super ();
        System.out.println("zi..."+x);
    }
    void show(){}
}


3 final關鍵字

   final :最終。作為一個修飾符,

       1,可以修飾類,函數,變量。

       2,被final修飾的類不可以被繼承。為了避免被繼承,被子類復寫功能。

       3,被final修飾的方法不可以被復寫。

       4,被final修飾的變量時一個常量只能賦值一次,既可以修飾成員變量,又可以修飾局部變量。

       當在描述事物時,一些數據的出現值是固定的,那么這時為了增強閱讀性,都給這些值起個名字,方便于閱讀。

       而這個值不需要改變,所以加上final修飾。

       作為常量:常量的書寫規范所有字符都大寫,如果由多個單詞組成。單詞間通過_連接。

       5,內部類定義在類中的局部位置上時,只能訪問該局部被final修飾的局部變量。

class Demo
{
    public static final double PI = 3.14;//全局常量。
    final void show1()
    {}
    void show2()
    {}
}
class SubDemo extends Demo
{
    void show1()
    {}
}
class FinalDemo
{
    public static void main(String[] args)
    {
        System.out.println("Hello World!");
    }
}


4 抽象類

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

   抽象方法的由來:

       多個對象都具備相同的功能,但是功能具體內容有所不同,那么在抽取過程中,只抽取了功能定義,并未抽取功能主體,那么只有功能聲明,沒有功能主體的方法稱為抽象方法。

   抽象類的特點:

       1,抽象方法一定在抽象類中。

       2,抽象方法和抽象類必須被abstract關鍵字修飾。

       3,抽象類不可以用new創建對象。因為調用抽象方法沒意義。

       4,抽象類中的抽象方法要被使用,必須有子類復寫其所有的抽象方法后,建立子類對象調用。如果子類值覆蓋了部分抽象方法,那么該子類還是抽象類。

   抽象類與一般類沒有太大的不同。

       該如何描述事物,就如何描述事物,只不過,該事物中出現了一些看不懂的東西。這些不確定的部分,也是該事物的功能,需要明確出來,但是無法定義主體。通過抽象方法來表示。

       抽象類比一般類多了抽象函數。

       抽象類不可以實例化。

   特殊:抽象類中可以不定義抽象方法,這樣做僅僅是不讓該類建立對象。

   抽象類的細節:

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

       2:抽象類中是否可以定義非抽象方法?

       可以。其實,抽象類和一般類沒有太大的區別,都是在描述事物,只不過抽象類在描述事物時,有些功能不具體。所以抽象類和一般類在定義上,都是需要定義屬性和行為的。只不過,比一般類多了一個抽象函數。而且比一般類少了一個創建對象的部分。

       3:抽象關鍵字abstract和哪些不可以共存?final ,  private , static

       4:抽象類中可不可以不定義抽象方法?可以。抽象方法目的僅僅為了不讓該類創建對象。

雇員示例:

   需求:公司中程序員有姓名,工號,薪水,工作內容。項目經理除了有姓名,工號,薪水,還有獎金,工作內容。對給出需求進行數據建模

abstract class Employee
{
    private String name;
    private String id;
    private double pay;
    Employee(String name,String id,double pay)
    {
        this.name = name;
        this.id = id;
        this.pay = pay;
    }
    public abstract void work();
}
class Manger extends Employee
{
    private int bonus;
    Manger(String name,String id,double pay,int bones)
    {
        super(name,id,pay);
        this.bonus= bouns;
        public void work()
        {
            System.out.println("manger work");
        }
    }
}
class Pro extends Employee
{
    Pro(String name,String id,double pay)
    {
        super(name,id,pay);
    }
    public void work()
    {
        System.out.println("pro work");
    }
}

   模板方法設計模式

       什么是模板方法?

       在定義功能時,功能的一部分是確定的。但是由一部分是不確定,而確定的部分在使用不確定的部分。那么這時就將不確定的部分暴露出去。由該類的子類去完成。

   

abstractclass GetTime{
         public final void getTime(){ //此功能如果不需要復寫,可加final限定
                   long start = System.currentTimeMillis();
                   code(); //不確定的功能部分,提取出來,通過抽象方法實現
                   long end =System.currentTimeMillis();
                   System.out.println("毫秒是:"+(end-start));
         }
         public abstract void code(); //抽象不確定的功能,讓子類復寫實現
}
classSubDemo extends GetTime{
         public void code(){ //子類復寫功能方法
                   for(int y=0; y<1000; y++){
                            System.out.println("y");
                   }
         }
}


5 接口

   接口:初期理解,可以認為是一個特殊的抽象類。當抽象類中的方法都是抽象的,那么該類可以通過接口的形式來表示。

   class用于定義類。interface用于定義接口。

   接口定義時,格式特點:

       1,接口中常見定義:常量,抽象方法。

       2,接口中的成員都有固定修飾符。

       常量:public static final

       方法:public abstract

       接口中的成員都是public的。

       接口:是不可以創建對象的,因為有抽象方法。需要被子類實現,子類對接口中的抽象方法全部覆蓋后,子類才可以實例化。否則子類是一個抽象類。

interfaceInter
{
         public static final int NUM = 3;
         public abstract void show();
}
interfaceInterA
{
         public abstract void show();
}
classDemo
{
         public void function(){}
}
classTest extends Demo implements Inter,InterA
{
         public void show(){}
}
接口可以被類多實現,也是對多繼承不支持的轉換形式,java支出多實現。
interfaceA
{
         void mehtodA();
}
interfaceB //extends A
{
         void mehtodB();
}
interfaceC extends B,A//接口可多繼承。
{
         void mehtodC();
}
class Dimplements C
{
         puclic void mehtodA(){}
         puclic void mehtodB(){}
         puclic void mehtodC(){}
}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尼勒克县| 新津县| 荥阳市| 库伦旗| 从江县| 馆陶县| 营口市| 东乌珠穆沁旗| 榕江县| 鲁甸县| 洛川县| 龙山县| 石狮市| 诸暨市| 淳化县| 枞阳县| 乌鲁木齐市| 蓝山县| 类乌齐县| 平江县| 博湖县| 莒南县| 四川省| 镇远县| 哈巴河县| 吉木乃县| 顺平县| 隆化县| 承德市| 杭锦旗| 视频| 安龙县| 石狮市| 宣武区| 浦县| 新巴尔虎右旗| 滦南县| 永丰县| 余庆县| 常熟市| 简阳市|