最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文詳解Object類和抽象類

 更新時間:2022年08月23日 16:29:36   作者:熬夜磕代碼丶  
這篇文章主要介紹了一文詳解Object類和抽象類,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,感興趣的小伙伴可以參考一下。希望對你的學(xué)習(xí)有所幫助

一、抽象類是什么?

在面向?qū)ο蟮母拍钪?,所有的對象都是通過類來描繪的,但是反過來,并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。

由于抽象類不能實例化對象,所以抽象類必須被繼承,才能被使用。也是因為這個原因,通常在設(shè)計階段決定要不要設(shè)計抽象類。
父類包含了子類集合的常見的方法,但是由于父類本身是抽象的,所以不能使用這些方法。

二、初始抽象類

2.1 基本語法

在 Java 語言中使用 abstract class 來定義抽象類。

如下實例:

abstract class Employee {

    //普通的成員屬性
    private String name;
    private String address;

    //構(gòu)造方法
    public Employee(String name, String address) {
        this.name = name;
        this.address = address;
    }

    //普通的成員方法
    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

注意到該 Employee 類沒有什么不同,盡管該類是抽象類,但是它仍然有 成員變量,成員方法和 構(gòu)造方法

注意:抽象類也是類,內(nèi)部可以包含普通方法和屬性,甚至構(gòu)造方法

public static void main(String[] args) {
        Employee employee = new Employee("zhangsan","shanxi");
    }

代碼可以編譯通過嗎?

我們可以發(fā)現(xiàn)抽象類是無法實例化對象的.

2.2 繼承抽象類

1.抽象方法的權(quán)限

abstract class Shape {
    abstract private void func();
}

抽象類要被繼承,需要子類實現(xiàn)抽象方法,所以抽象方法的權(quán)限不能是private.

注意:抽象方法沒有加訪問限定符時,默認(rèn)是public.

abstract class Shape {
    abstract final void func();
}

** 抽象方法不能被final和static修飾,因為抽象方法要被子類重寫**

先寫一個Shape抽象類:

abstract class Shape {
    //被abstract修飾的抽象方法,沒有方法體
    abstract public void draw();
    abstract void calcArea();
}

抽象類必須被繼承,并且繼承后子類要重寫父類中的抽象方法,否則子類也是抽象類,必須要使用 abstract 修飾

class Circle extends Shape {
    private double r;
    final private static double PI = 3.14;

    public Circle(double r) {
        this.r = r;
    }

    @Override
    public void draw() {
        System.out.println("畫圓!");
    }

    @Override
    void calcArea() {
        System.out.println("面積為: "+PI*r*r);
    }
}
public static void main(String[] args) {
        Circle circle = new Circle(2);
        circle.draw();
        circle.calcArea();
    }

實現(xiàn)父類的抽象方法后,即可正常實例化

class Rect extends Shape {
    @Override
    public void draw() {
        
    }
}

子類繼承抽象類時,要么把抽象方法全部實現(xiàn),不然將子類繼續(xù)抽象化.

三、抽象類總結(jié)

  • 1.抽象類中必須使用abstract修飾類
  • 2.抽象類中可以包含普通類所能包含的成員
  • 3.抽象類和普通類不一樣的是:抽象類可以包含抽象方法.
  • 4.抽象方法使用abstract修飾的,這個方法沒有具體的實現(xiàn)
  • 5.不能實例化抽象類
  • 6.抽象類最大的意義就是被繼承
  • 7.如果一個普通類繼承了一個抽象類,那么必須重寫抽象類當(dāng)中的方法,否則寫為抽象類
  • 8.抽象方法不能是私有的,static?也就是要滿足重寫的規(guī)則
  • 9.final?不可以它和abstract是矛盾的
  • 10.抽象類當(dāng)中可以有構(gòu)造方法,為了方便子類調(diào)用,來初始化類中的成員變量.
  • 11.抽象類的出現(xiàn),是為了讓程序員更早的發(fā)現(xiàn)錯誤,防止出錯,讓編譯器及時提醒我們.

四、Object類

4.1 初始Object

Java Object 類是所有類的父類,也就是說 Java 的所有類都繼承了 Object,子類可以使用 Object 的所有方法。
Object 類位于 java.lang 包中,編譯時會自動導(dǎo)入,我們創(chuàng)建一個類時,如果沒有明確繼承一個父類,那么它就會自動繼承 Object,成為 Object 的子類。

class Person {
    
}
class Person extends Object {
    
}

這兩種是一模一樣的.

4.2 toString

Object中的toString方法:

public static void main(String[] args) {
        Circle circle = new Circle(2);
        System.out.println(circle);
    }

我們要打印circle對象具體內(nèi)容的話,需要重寫toString方法.

public String toString() {
        return "Circle{" +
                "r=" + r +
                '}';
    }

4.3 equals

在Java中,進(jìn)行比較時:

  • a.如果雙等號左右兩側(cè)是基本類型變量,比較的是變量中值是否相同
  • b.如果雙等號左右兩側(cè)是引用類型變量,比較的是引用變量地址是否相同
  • c.如果要比較對象中內(nèi)容,必須重寫Object中的equals方法,因為equals方法默認(rèn)也是按照地址比較的:
public static void main(String[] args) {
        Circle circle = new Circle(2);
        Circle circle1 = new Circle(2);
        int a = 1;
        int b = 1;
        System.out.println(a == b);
        System.out.println(circle == circle1);
        System.out.println(circle.equals(circle1));
    }

每次new一個對象都會在堆開辟一個新的空間.

Object定義的equals方法,在兩個對象調(diào)用時對比的是兩個對象地址是否相等,而不是具體對象中的內(nèi)容這時候我們需要重寫equals方法.

 @Override
    public boolean equals(Object obj) {
        if(obj == null) {
            return false;
        }
        if(this == obj) {
            return true;
        }
        if(!(obj instanceof Circle)) {
            return false;
        }
        Circle circle = (Circle)obj;
        return this.r == circle.r;
    }

比較對象中內(nèi)容是否相同的時候,一定要重寫equals方法。

4.4 hashcode

我們可以發(fā)現(xiàn)toString方法中有使用到這個方法,我們目前只需要知道它是一個內(nèi)存地址,然后調(diào)用Integer.toHexString()方法,將這個地址以16進(jìn)制輸出。

public static void main(String[] args) {
        Circle circle1 = new Circle(2);
        Circle circle2 = new Circle(2);
        System.out.println(circle1.hashCode());
        System.out.println(circle2.hashCode());
    }

我們認(rèn)為兩個存儲相同值的Circle對象,在調(diào)用Object的hashcode方法時,輸出的值不一樣.

//重寫hashCode方法
@Override
    public int hashCode() {
        return Objects.hash(r);
    }

當(dāng)我們重寫hashCode后,當(dāng)兩個對象存儲的內(nèi)容一樣時,輸出的哈希值是一樣的.

結(jié)論:

  • 1、hashcode方法用來確定對象在內(nèi)存中存儲的位置是否相同
  • 2、事實上hashCode() 在散列表中才有用,在其它情況下沒用。在散列表中hashCode() 的作用是獲取對象的散列碼,進(jìn)而確定該對象在散列表中的位置。

到此這篇關(guān)于一文詳解Object類和抽象類的文章就介紹到這了,更多相關(guān)Object抽象類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合SQLite數(shù)據(jù)庫全過程

    SpringBoot整合SQLite數(shù)據(jù)庫全過程

    sqlite是一個很輕量級的數(shù)據(jù)庫,可以滿足日常sql的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合SQLite數(shù)據(jù)庫的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-03-03
  • Java多線程死鎖問題詳解(wait和notify)

    Java多線程死鎖問題詳解(wait和notify)

    線程之間形成相互等待資源的環(huán)時,就會形成順序死鎖,下面這篇文章主要給大家介紹了關(guān)于Java多線程死鎖問題(wait和notify)的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Java try()語句實現(xiàn)try-with-resources異常管理機(jī)制操作

    Java try()語句實現(xiàn)try-with-resources異常管理機(jī)制操作

    這篇文章主要介紹了Java try()語句實現(xiàn)try-with-resources異常管理機(jī)制操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Maven中生命周期的具體使用

    Maven中生命周期的具體使用

    在 Maven 出現(xiàn)之前,項目構(gòu)建的生命周期就已經(jīng)存在,本文主要介紹了Maven中生命周期的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • Mybatis分頁查詢主從表的實現(xiàn)示例

    Mybatis分頁查詢主從表的實現(xiàn)示例

    本文主要介紹了Mybatis分頁查詢主從表的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • Java基礎(chǔ)之反射

    Java基礎(chǔ)之反射

    JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意一個方法和屬性;反射是框架設(shè)計的靈魂,感興趣的小伙伴可以參考閱讀
    2023-03-03
  • JAVA實現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼

    JAVA實現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼

    這篇文章主要介紹了JAVA實現(xiàn)將磁盤中所有空文件夾進(jìn)行刪除的代碼,需要的朋友可以參考下
    2017-06-06
  • Java中GC的工作原理詳細(xì)介紹

    Java中GC的工作原理詳細(xì)介紹

    這篇文章主要介紹了Java中GC的工作原理詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • IDEA Maven依賴下載總是失敗的幾種解決方法

    IDEA Maven依賴下載總是失敗的幾種解決方法

    我們本地使用 IDEA 運(yùn)行 maven 項目的時候,有時候運(yùn)氣不好,就會遇到某些 maven 依賴無法正常找到、導(dǎo)入,這就會導(dǎo)致 IDEA 構(gòu)建項目的時候爆出一堆醒目的紅色 Error,今天給大家分享IDEA Maven依賴下載總是失敗的幾種解決方法,感興趣的朋友一起看看吧
    2023-09-09
  • Java線程中賣火車票問題的深入講解

    Java線程中賣火車票問題的深入講解

    這篇文章主要給大家介紹了關(guān)于Java線程中賣火車票問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11

最新評論

建瓯市| 宣化县| 阿巴嘎旗| 伊金霍洛旗| 新龙县| 丹寨县| 广昌县| 拉萨市| 新密市| 集贤县| 绥宁县| 遵义市| 额尔古纳市| 砚山县| 宁河县| 应城市| 邛崃市| 长武县| 民和| 泊头市| 翼城县| 宁乡县| 射洪县| 璧山县| 含山县| 老河口市| 乌恰县| 平山县| 寿宁县| 新昌县| 铁岭市| 新闻| 河东区| 萨迦县| 根河市| 石门县| 喀什市| 贡嘎县| 安吉县| 萨迦县| 闻喜县|