成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java 面向?qū)ο?

cncoder / 2341人閱讀

摘要:自從轉(zhuǎn)到前段,差不多有一年時間沒有動了,今天老弟問我關于的面向?qū)ο?,自己不敢直接回答了,也許自己真的應該去做相關的考究了。要有父類引用指向子類對象。外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對象。

自從轉(zhuǎn)到前段,差不多有一年時間沒有動Java了,今天老弟問我關于Java的面向?qū)ο?,自己不敢直接回答了,也許自己真的應該去做相關的考究了。然后在告訴他吧,記在這里當做一個筆記吧。

 什么是繼承

就是把多個具有具有相同的屬性和行為的類抽象到一個類,然后遇到相似的行為和屬性,就可以直接繼承,沒有重復寫。

優(yōu)點

復用性強

類與類之間有關系,是多態(tài)的前提

繼承的特點

1, Java只支持單繼承

//一個類只能有一個父類,不可以有多個父類。
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2...//error

2, Java支持多層(重)繼承(繼承體系)

class A{}
class B extends A{}
class C extends B{}
super和this有什么區(qū)別

super是一個關鍵字,代表父類的存儲空間標識。(可以理解為父親的引用)

super和this的用法相似。

this代表對象的引用(誰調(diào)用就代表誰);
super代表當前子類對父類的引用。

使用場景

當子父類出現(xiàn)同名成員時,可以用super進行區(qū)分;

子類要調(diào)用父類構造函數(shù)時,可以使用super語句。

區(qū)別

1 成員變量

this.變量    --    本類的
super.變量    --    父類的

2.構造方法

this(...)    --    本類的
super(...)    --    父類的

3.成員方法

this.方法名()    --    本類的    
super.方法名()    --    父類的
super();和this();都是在構造函數(shù)的第一行,不能同時出現(xiàn)。
方法的重寫(覆蓋)

子類中出現(xiàn)與父類一模一樣的方法時(除了權限修飾符,權限修飾符大于等于不包括private,返回值類型,方法名和參數(shù)列表相同),會出現(xiàn)覆蓋操作,也稱為重寫或者復寫。

父類私有方法,子類看不到,因此父類私有方法的重寫也就無從談起。

多態(tài)

多態(tài)的前提:

要有繼承或者實現(xiàn)關系。

要有方法的重寫。

要有父類引用指向子類對象。

多態(tài)自始至終都是子類對象在變化!

     //多態(tài)向下轉(zhuǎn)型和向上轉(zhuǎn)型的例子,
     //多態(tài)轉(zhuǎn)型解決了多態(tài)中父類引用不能使用子類特有成員的弊端。
 class PolymorphicTest2 {
        public static void main(String[] args) {
        Phone p1 = new Nokia();        //向上轉(zhuǎn)型,類型提升
        Nokia no = (Nokia)p1;         
         //向下轉(zhuǎn)型,強制將父類的引用轉(zhuǎn)換成子類類型,不能將Nokia類型轉(zhuǎn)成    Moto或Nexus類型
        no.print();                    //輸出結果為Phone---null---0,因為繼承了父類的方法

        Phone p2 = new Moto();
        Moto m = (Moto)p2;
        m.print();        //輸出結果為Moto---yellow---1599,方法重寫,子類方法覆蓋父類方法

        Phone p3 = new Nexus();
        Nexus ne = (Nexus)p3;
        ne.print();
        }
    }

    class Phone{    
        String color;
        int price;

        public void print(){
        System.out.println("Phone---" + color + "---" + price );
        }    
    }

    class Nokia extends Phone{
        String color = "red";
        int price = 1009;

        //public void print(){
        //    System.out.println("Nokia---" + color + "---" + price);
        //}
    }

    class Moto extends Phone{
        String color = "yellow";
        int price = 1599;

        public void print(){
        System.out.println("Moto---" + color + "---" + price);
        }
    }

    class Nexus extends Phone{
        String color = "black";
        int price = 1999;

        public void print(){
        System.out.println("Nexus---" + color + "---" + price);
        }
    }
 }
抽象(abstract)

抽象就是從多個事物中將共性的,本質(zhì)的內(nèi)容抽象出來。

抽象類:

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

由來:

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

抽象類特點:

抽象方法一定在抽象類中;

抽象方法和抽象類都必須被abstract關鍵字修飾;

抽象類不可以用new創(chuàng)建對象,因為調(diào)用抽象方法沒意義;

抽象類中的抽象方法要被使用,必須由子類復寫其所有的抽象方法后,建立子類對象調(diào)用; 如果子類只覆蓋了部分* 的抽象方法,那么該子類還是一個抽象類;

抽象類中可以有抽象方法,也可以有非抽象方法,抽象方法用于子類實例化;

如果一個類是抽象類,那么,繼承它的子類,要么是抽象類,要么重寫所有抽象方法。

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

抽象類的成員特點:

1, 成員變量:可以是變量,也可以是常量;
2, 構造方法:有構造方法;
3, 成員方法:可以是抽象方法,也可以是非抽象方法。

abstract class 葵花寶典 {
    public abstract void 自宮();
}

class 岳不群 extends 葵花寶典 {
    public void 自宮(){
        System.out.println("剪刀");
    }
}

class 林平之 extends 葵花寶典{
    public void 自宮(){
        System.out.println("指甲刀");
    }
}
class AbstractTest  {
    public static void main(String[] args) {
        岳不群 岳 = new 岳不群();
        岳.自宮();

        林平之 林 = new 林平之();
        林.自宮();
    }
}    
抽象類注意事項:

抽象類不能被實例化,為什么還有構造函數(shù)?

只要是class定義的類里面就肯定有構造函數(shù)。抽象類中的函數(shù)是給子類實例化的。

一個類沒有抽象方法,為什么定義為抽象類?

不想被繼承,還不想被實例化。

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

final:如果方法被抽象,就需要被覆蓋,而final是不可以被覆蓋,所以沖突。
private:如果函數(shù)被私有了,子類無法直接訪問,怎么覆蓋呢?
static:不需要對象,類名就可以調(diào)用抽象方法。而調(diào)用抽象方法沒有意義。

接口(interface)

接口是抽象方法和常量值的集合。從本質(zhì)上講,接口是一種特殊的抽象類,這種抽象類只包含常量和方法的定義,而沒有變量和方法的實現(xiàn)。

格式:interface 接口名{}

接口的出現(xiàn)將"多繼承"通過另一種形式體現(xiàn)出來,即"多實現(xiàn)"。

實現(xiàn)(implements)

格式:class 類名 implements 接口名 {}

特點:

接口不能被實例化。
一個類如果實現(xiàn)了接口,要么是抽象類,要么實現(xiàn)接口中的所有方法。
接口的成員特點:

接口中的成員修飾符是固定的!

成員常量:public static final,接口里定義的變量是全局常量,而且修飾符只能是這三個關鍵字,都可以省略,常量名要大寫。
成員方法:public abstract,接口里定義的方法都是抽象的,兩個修飾符關鍵字可省略。
推薦:永遠手動給出修飾符。
繼承與實現(xiàn)的區(qū)別:

類與類之間稱為繼承關系:因為該類無論是抽象的還是非抽象的,它的內(nèi)部都可以定義非抽象方法,這個方法可以直接被子類使用,子類繼承即可。只能單繼承,可以多層繼承。((class))
類與接口之間是實現(xiàn)關系:因為接口中的方法都是抽象的,必須由子類實現(xiàn)才可以實例化??梢詥螌崿F(xiàn),也可以多實現(xiàn);還可以在繼承一個類的同時實現(xiàn)多個接口。((class) extends (class) implements (interface1,interface2…))
接口與接口之間是繼承關系:一個接口可以繼承另一個接口,并添加新的屬性和抽象方法,并且接口可以多繼承。((interface) extends (interface1,interface2…))
抽象類和接口的區(qū)別:

成員變量

抽象類能有變量也可以有常量
接口只能有常量
成員方法

抽象類可以有非抽象的方法,也可以有抽象的方法
接口只能有抽象的方法
構造方法

-抽象類有構造方法
-接口沒有構造方法

類與抽象類和接口的關系

類與抽象類的關系是繼承 extends
類與接口的關系是實現(xiàn) implements
接口的思想特點:

接口是對外暴露的規(guī)則;
接口是程序的功能擴展;
接口的出現(xiàn)降低耦合性;(實現(xiàn)了模塊化開發(fā),定義好規(guī)則,每個人實現(xiàn)自己的模塊,大大提高了開發(fā)效率)
接口可以用來多實現(xiàn);
多個無關的類可以實現(xiàn)同一個接口;
一個類可以實現(xiàn)多個相互直接沒有關系的接口;
與繼承關系類似,接口與實現(xiàn)類之間存在多態(tài)性。

//運動員和教練的案例(下圖是思路分析)

/*
    籃球運動員和教練
    乒乓球運動員和教練
    現(xiàn)在籃球運動員和教練要出國訪問,需要學習英語
    請根據(jù)你所學的知識,分析出來哪些是類,哪些是抽象類,哪些是接口
*/
interface SpeakEnglish {
    public abstract void speak();
}

interface GoAboard{
    public abstract void aboard();
}

abstract class Person {
    private String name;
    private int age;

    public Person(){}

    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return name;
    }

    public void setAge(int age){
        this.age = age;
    }
    public int getAge(){
        return age;
    }

    //吃飯
    public abstract void eat();
    //睡覺
    public void sleep(){
        System.out.println("Zzz...");
    }
}
//運動員
abstract class Player extends Person {
    public abstract void study();
}
//教練
abstract class Coach extends Person {
    public abstract void teach();
}

//籃球運動員
class BasketballPlayer extends Player implements SpeakEnglish,GoAboard{
    public void eat(){
        System.out.println(getAge() + "歲的" + getName() + "吃雞腿");
    }

    public void study(){
        System.out.println(getAge() + "歲的" + getName() + "學扣籃");
    }

    public void speak(){
        System.out.println(getAge() + "歲的" + getName() + " Say Hello World");
    }

    public void aboard(){
        System.out.println(getAge() + "歲的" + getName() + " Go Aboard");
    }
}
//乒乓運動員
class PingPangPlayer extends Player{
    public void eat(){
        System.out.println(getAge() + "歲的" + getName() + "吃雞蛋");
    }

    public void study(){
        System.out.println(getAge() + "歲的" + getName() + "學扣球");
    }
}
//籃球教練
class BasketballCoach extends Coach implements SpeakEnglish {
    public void eat(){
        System.out.println(getAge() + "歲的" + getName() + "啃雞爪");
    }

    public void teach(){
        System.out.println(getAge() + "歲的" + getName() + "教扣籃");
    }

    public void speak(){
        System.out.println(getAge() + "歲的" + getName() + " Say Hello Java");
    }

    public void aboard(){
        System.out.println(getAge() + "歲的" + getName() + " Go Aboard");
    }
}
//乒乓球教練
class PingPangCoach extends Coach{
    public void eat(){
        System.out.println(getAge() + "歲的" + getName() + "吃雞蛋皮");
    }

    public void teach(){
        System.out.println(getAge() + "歲的" + getName() + "教扣球");
    }
}
class PlayerAndCoach {
    public static void main(String[] args) {
        //籃球運動員
        BasketballPlayer bp = new BasketballPlayer();
        bp.setName("郭艾倫");
        bp.setAge(33);
        bp.eat();
        bp.sleep();
        bp.study();
        bp.speak();
        bp.aboard();
        System.out.println("***********************");
        //籃球教練
        BasketballCoach bc = new BasketballCoach();
        bc.setName("波波維奇");
        bc.setAge(65);
        bc.eat();
        bc.sleep();
        bc.teach();
        bc.speak();
        bc.aboard();
        System.out.println("***********************");
        //多態(tài)
        Person p = new BasketballPlayer();
        p.setName("Kobe Bryant");
        p.setAge(33);
        p.eat();
        p.sleep();
        //p.study();
        //p.speak();

        BasketballPlayer bp2 = (BasketballPlayer)p;
        bp2.study();
        bp2.speak();
        bp2.aboard();
        System.out.println("***********************");
    }
}
內(nèi)部類

將一個類定義在另一個類里面,里面的那個類就稱為內(nèi)部類。內(nèi)部類的出現(xiàn),再次打破了Java單繼承的局限性。

訪問特點:

內(nèi)部類可以直接訪問外部類的成員,包括私有成員。
外部類要訪問內(nèi)部類的成員,必須要建立內(nèi)部類的對象。
內(nèi)部類分類及共性:
共性:

內(nèi)部類仍然是一個獨立的類,在編譯之后會內(nèi)部類會被編譯成獨立的.class文件,但是前面冠以外部類的類名和$符號。
內(nèi)部類不能用普通的方式訪問。內(nèi)部類是外部類的一個成員,因此內(nèi)部類可以自由地訪問外部類的成員變量,無論是否是private的。
成員內(nèi)部類

在外部類中有成員變量和成員方法,成員內(nèi)部類就是把整個一個類作為了外部類的成員;
成員內(nèi)部類是定義在類中方法外的類;
創(chuàng)建對象的格式為:外部類名.內(nèi)部類名 對象名 = 外部類對象.內(nèi)部類對象;
成員內(nèi)部類之所以可以直接訪問外部類的成員,那是因為內(nèi)部類中都持有一個外部類對象的引用:外部類名.this;
成員內(nèi)部類可以用的修飾符有final,abstract,public,private,protected,static.

靜態(tài)內(nèi)部類

靜態(tài)內(nèi)部類就是成員內(nèi)部類加上靜態(tài)修飾符static,定義在類中方法外。

在外部類中訪問靜態(tài)內(nèi)部類有兩種場景:

在外部類中訪問靜態(tài)內(nèi)部類中非靜態(tài)成員:外部類名.內(nèi)部類名 對象名 = 外部類名.內(nèi)部對象,需要通過創(chuàng)建對象訪問;
在外部類中訪問靜態(tài)內(nèi)部類中的靜態(tài)成員:同樣可以使用上面的格式進行訪問,也可以直接使用外部類名.內(nèi)部類名.成員。
局部內(nèi)部類

局部內(nèi)部類是定義在方法中的類。

方法內(nèi)部類只能在定義該內(nèi)部類的方法內(nèi)實例化,不可以在此方法外對其實例化。
方法內(nèi)部類對象不能使用該內(nèi)部類所在方法的非final局部變量。
可以用于方法內(nèi)部類的修飾符有final,abstract;

靜態(tài)方法中的方法內(nèi)部類只能訪問外部的靜態(tài)成員。

匿名內(nèi)部類

匿名內(nèi)部類是內(nèi)部類的簡化寫法,是建立一個帶內(nèi)容的外部類或者接口的子類匿名對象。
前提:
內(nèi)部類可以繼承或?qū)崿F(xiàn)一個外部類或者接口。
格式:
new 外部類名或者接口名(){重寫方法};
通常在方法的形式參數(shù)是接口或者抽象類,并且該接口中的方法不超過三個時,可以將匿名內(nèi)部類作為參數(shù)傳遞。

參考

Java集合的小抄 Java初學者必備

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64401.html

相關文章

  • 夯實Java:從面向對象說起

    摘要:面向?qū)ο笈c面向過程的區(qū)別要知道,二者并不是非此即彼,而是相輔相成的。而面向過程,則在微觀上對對象內(nèi)部進行具體的實現(xiàn)。面向?qū)ο蟮娜筇匦哉f到面向?qū)ο?,就不得不說其三大特性封裝繼承和多態(tài)。封裝封裝是面向?qū)ο笞罨A的特性。 作者:伯特出處:github.com/ruicbAndroid/LoulanPlan聲明:本文出自伯特的《LoulanPlan》,轉(zhuǎn)載務必注明作者及出處。 剛學習 Jav...

    hearaway 評論0 收藏0
  • 樂字節(jié)Java編程語言發(fā)展、面向對象和類

    摘要:二面向?qū)ο蟾攀雒嫦蜻^程的設計思想和面向?qū)ο蟮脑O計思想我要吃魚香肉絲蓋飯面向過程我買菜我洗菜我切菜我放水我點火我做飯我炒菜。。。。 大家好,上次我們講過了樂字節(jié)Java編程之方法、調(diào)用、重載、遞歸,接下來我們將會進入到Java封裝的內(nèi)容。Java編程語言發(fā)展,面向?qū)ο蠛皖悺?一、編程語言的發(fā)展 機器語言——直接由計算機的指令組成,指令、數(shù)據(jù)、地址都以0和1組成:可以被計算機直接識別并執(zhí)行...

    lufficc 評論0 收藏0
  • 7. 初步理解面向對象 【連載 7】

    摘要:是一種典型的面向?qū)ο缶幊陶Z言。這篇文章主要是來初步理解一下面向?qū)ο蟮乃季S為下面的內(nèi)容先給一個基礎。針對面向?qū)ο缶幊痰母鄡?nèi)容,會在后面的文章里面詳細解釋。他們都稱之為對象。之后,我們再用編程語言,把這種映射編寫出來,就是的面向?qū)ο缶幊汤病? showImg(https://segmentfault.com/img/remote/1460000012983458?w=900&h=500);...

    keelii 評論0 收藏0
  • 談談我所理解的面向對象

    摘要:眾多面向?qū)ο蟮木幊趟枷腚m不盡一致,但是無論哪種面向?qū)ο缶幊陶Z言都具有以下的共通功能。原型編程以類為中心的傳統(tǒng)面向?qū)ο缶幊蹋且灶悶榛A生成新對象。而原型模式的面向?qū)ο缶幊陶Z言沒有類這樣一個概念。 什么是面向?qū)ο??這個問題往往會問到剛畢業(yè)的新手or實習生上,也是往往作為一個技術面試的開頭題。在這里我們不去談如何答(fu)好(yan)問(guo)題(qu),僅談談我所理解的面向?qū)ο蟆?從歷...

    avwu 評論0 收藏0
  • Java學習筆記——面向對象

    摘要:對象既是該類事物實實在在存在的個體。類與對象的關系圖類就是汽車汽車就是堆內(nèi)存中的對象。成員變量成員變量成員函數(shù)的車,輪胎數(shù)個,跑起來了對象的創(chuàng)建創(chuàng)建對象中創(chuàng)建對象,使用關鍵字在堆內(nèi)存中開辟了空間,產(chǎn)生了一個實體。 聲明:本文首發(fā)于我的個人微信公眾號【Java編程社區(qū)】,查看更多文章與學習資源請移步我的公眾號Java編程社區(qū) 萬物皆對象 學習Java,我們都聽過這句話:萬物皆對象。那么什...

    DoINsiSt 評論0 收藏0
  • Java知識點總結(面向對象

    摘要:知識點總結面向?qū)ο笾R點總結面向?qū)ο竺嫦驅(qū)ο蟾拍钍窍鄬τ诿嫦蜻^程而言,過程其實就是函數(shù),對象是將函數(shù)和屬性進行了封裝。指向了該對象關鍵字代表對象。靜態(tài)變量所屬于類,所以也稱為類變量成員變量存在于堆內(nèi)存中。 Java知識點總結(面向?qū)ο螅?@(Java知識點總結)[Java, Java面向?qū)ο骫 [toc] 面向?qū)ο蟾拍?是相對于面向過程而言,過程其實就是函數(shù),對象是將函數(shù)和屬性進行了封...

    itvincent 評論0 收藏0

發(fā)表評論

0條評論

cncoder

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<