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

一文帶你搞懂Java中Object類(lèi)和抽象類(lèi)

 更新時(shí)間:2022年08月30日 14:08:42   作者:熬夜磕代碼丶  
這篇文章主要為大家詳細(xì)介紹了Java中Object類(lèi)和抽象類(lèi)的定義與使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下

一、抽象類(lèi)是什么

在面向?qū)ο蟮母拍钪校械膶?duì)象都是通過(guò)類(lèi)來(lái)描繪的,但是反過(guò)來(lái),并不是所有的類(lèi)都是用來(lái)描繪對(duì)象的,如果一個(gè)類(lèi)中沒(méi)有包含足夠的信息來(lái)描繪一個(gè)具體的對(duì)象,這樣的類(lèi)就是抽象類(lèi)。

由于抽象類(lèi)不能實(shí)例化對(duì)象,所以抽象類(lèi)必須被繼承,才能被使用。也是因?yàn)檫@個(gè)原因,通常在設(shè)計(jì)階段決定要不要設(shè)計(jì)抽象類(lèi)。

父類(lèi)包含了子類(lèi)集合的常見(jiàn)的方法,但是由于父類(lèi)本身是抽象的,所以不能使用這些方法。

二、初始抽象類(lèi)

2.1 基本語(yǔ)法

在 Java 語(yǔ)言中使用 abstract class 來(lái)定義抽象類(lèi)。如下實(shí)例:

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 類(lèi)沒(méi)有什么不同,盡管該類(lèi)是抽象類(lèi),但是它仍然有 成員變量,成員方法和 構(gòu)造方法

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

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

代碼可以編譯通過(guò)嗎?

我們可以發(fā)現(xiàn)抽象類(lèi)是無(wú)法實(shí)例化對(duì)象的.

2.2 繼承抽象類(lèi)

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

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

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

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

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

** 抽象方法不能被final和static修飾,因?yàn)槌橄蠓椒ㄒ蛔宇?lèi)重寫(xiě)**

先寫(xiě)一個(gè)Shape抽象類(lèi)

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

抽象類(lèi)必須被繼承,并且繼承后子類(lèi)要重寫(xiě)父類(lèi)中的抽象方法,否則子類(lèi)也是抽象類(lèi),必須要使用 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("畫(huà)圓!");
    }

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

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

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

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

三、抽象類(lèi)總結(jié)

1.抽象類(lèi)中必須使用abstract修飾類(lèi)

2.抽象類(lèi)中可以包含普通類(lèi)所能包含的成員

3.抽象類(lèi)和普通類(lèi)不一樣的是:抽象類(lèi)可以包含抽象方法.

4.抽象方法使用abstract修飾的,這個(gè)方法沒(méi)有具體的實(shí)現(xiàn)

5.不能實(shí)例化抽象類(lèi)

6.抽象類(lèi)最大的意義就是被繼承

7.如果一個(gè)普通類(lèi)繼承了一個(gè)抽象類(lèi),那么必須重寫(xiě)抽象類(lèi)當(dāng)中的方法,否則寫(xiě)為抽象類(lèi)

8.抽象方法不能是私有的,static?也就是要滿足重寫(xiě)的規(guī)則

9.final?不可以它和abstract是矛盾的

10.抽象類(lèi)當(dāng)中可以有構(gòu)造方法,為了方便子類(lèi)調(diào)用,來(lái)初始化類(lèi)中的成員變量.

11.抽象類(lèi)的出現(xiàn),是為了讓程序員更早的發(fā)現(xiàn)錯(cuò)誤,防止出錯(cuò),讓編譯器及時(shí)提醒我們.

四、Object類(lèi)

4.1 初始Object

Java Object 類(lèi)是所有類(lèi)的父類(lèi),也就是說(shuō) Java 的所有類(lèi)都繼承了 Object,子類(lèi)可以使用 Object 的所有方法。

Object 類(lèi)位于 java.lang 包中,編譯時(shí)會(huì)自動(dòng)導(dǎo)入,我們創(chuàng)建一個(gè)類(lèi)時(shí),如果沒(méi)有明確繼承一個(gè)父類(lèi),那么它就會(huì)自動(dòng)繼承 Object,成為 Object 的子類(lèi)。

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對(duì)象具體內(nèi)容的話,需要重寫(xiě)toString方法.

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

4.3 equals

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

a.如果雙等號(hào)左右兩側(cè)是基本類(lèi)型變量,比較的是變量中值是否相同

b.如果雙等號(hào)左右兩側(cè)是引用類(lèi)型變量,比較的是引用變量地址是否相同

c.如果要比較對(duì)象中內(nèi)容,必須重寫(xiě)Object中的equals方法,因?yàn)閑quals方法默認(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一個(gè)對(duì)象都會(huì)在堆開(kāi)辟一個(gè)新的空間.

Object定義的equals方法,在兩個(gè)對(duì)象調(diào)用時(shí)對(duì)比的是兩個(gè)對(duì)象地址是否相等,而不是具體對(duì)象中的內(nèi)容這時(shí)候我們需要重寫(xiě)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;
    }

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

4.4 hashcode

我們可以發(fā)現(xiàn)toString方法中有使用到這個(gè)方法,我們目前只需要知道它是一個(gè)內(nèi)存地址,然后調(diào)用Integer.toHexString()方法,將這個(gè)地址以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)為兩個(gè)存儲(chǔ)相同值的Circle對(duì)象,在調(diào)用Object的hashcode方法時(shí),輸出的值不一樣.

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

當(dāng)我們重寫(xiě)hashCode后,當(dāng)兩個(gè)對(duì)象存儲(chǔ)的內(nèi)容一樣時(shí),輸出的哈希值是一樣的.

結(jié)論:

1、hashcode方法用來(lái)確定對(duì)象在內(nèi)存中存儲(chǔ)的位置是否相同

2、事實(shí)上hashCode() 在散列表中才有用,在其它情況下沒(méi)用。在散列表中hashCode() 的作用是獲取對(duì)象的散列碼,進(jìn)而確定該對(duì)象在散列表中的位置。

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

相關(guān)文章

  • java基礎(chǔ)--JDK SPI概述

    java基礎(chǔ)--JDK SPI概述

    SPI是一種服務(wù)發(fā)現(xiàn)機(jī)制,本文就SPI做了詳細(xì)概述,具有很好的參考價(jià)值,希望對(duì)小伙伴們有所幫助,感興趣的朋友一起來(lái)參考參考吧
    2021-08-08
  • SpringBoot異常處理器的使用與添加員工功能實(shí)現(xiàn)流程介紹

    SpringBoot異常處理器的使用與添加員工功能實(shí)現(xiàn)流程介紹

    設(shè)計(jì)完了登錄與退出功能還只完成了冰山一角,經(jīng)過(guò)測(cè)試發(fā)現(xiàn),我們以u(píng)rl的方式來(lái)訪問(wèn)網(wǎng)站時(shí)可以直接跳過(guò)登陸頁(yè)面進(jìn)入后臺(tái)頁(yè)面,這樣顯然是不合理的,下面我們通過(guò)異常攔截器+boot來(lái)做到訪問(wèn)限制,以及實(shí)現(xiàn)新增員工功能,制作全局異常處理器
    2022-10-10
  • idea編譯器工程out目錄修改方法步驟

    idea編譯器工程out目錄修改方法步驟

    多個(gè)工程在一個(gè)文件夾下,有時(shí)會(huì)變?yōu)樗械墓こ讨挥靡粋€(gè)out文件夾,這時(shí)運(yùn)行會(huì)出錯(cuò),所以本文就來(lái)介紹一下out目錄修改,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)

    java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié)

    在使用java的集合類(lèi)遍歷數(shù)據(jù)的時(shí)候,在某些情況下可能需要對(duì)某些數(shù)據(jù)進(jìn)行刪除,下面這篇文章主要給大家介紹了關(guān)于java遍歷途中修改數(shù)據(jù)及刪除數(shù)據(jù)的方法總結(jié),需要的朋友可以參考下
    2023-10-10
  • springSecurity之如何添加自定義過(guò)濾器

    springSecurity之如何添加自定義過(guò)濾器

    這篇文章主要介紹了springSecurity之如何添加自定義過(guò)濾器的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring責(zé)任鏈模式使用實(shí)例講解

    Spring責(zé)任鏈模式使用實(shí)例講解

    責(zé)任鏈?zhǔn)切袨樾驮O(shè)計(jì)模式的一種,通過(guò)前一個(gè)處理者記錄下一個(gè)處理者的方式形成一條處理鏈??蛻?hù)端在調(diào)用時(shí)只需要將請(qǐng)求傳遞到責(zé)任上即可,無(wú)需關(guān)注鏈路中的具體的傳遞過(guò)程。而鏈路中內(nèi)部的處理,是按照前一個(gè)處理者記錄的下一個(gè)處理者依次執(zhí)行
    2023-01-01
  • Spring boot集中異常處理方法實(shí)例

    Spring boot集中異常處理方法實(shí)例

    這篇文章主要介紹了Spring boot集中異常處理方法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • JAVA8妙用Optional解決判斷Null為空的問(wèn)題方法

    JAVA8妙用Optional解決判斷Null為空的問(wèn)題方法

    本文主要介紹了JAVA8妙用Optional解決判斷Null為空的問(wèn)題方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • kafka運(yùn)維consumer-groups.sh消費(fèi)者組管理

    kafka運(yùn)維consumer-groups.sh消費(fèi)者組管理

    這篇文章主要為大家介紹了kafka運(yùn)維consumer-groups.sh消費(fèi)者組管理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • mybatis-plus中的Enum用法實(shí)例

    mybatis-plus中的Enum用法實(shí)例

    本文主要介紹了mybatis-plus中的Enum用法實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評(píng)論

河南省| 乡宁县| 庆元县| 四川省| 襄城县| 岑溪市| 长宁区| 普兰县| 望江县| 林芝县| 洛阳市| 奇台县| 高密市| 南溪县| 铁岭市| 西峡县| 洛阳市| 昆明市| 含山县| 铜梁县| 五台县| 沂水县| 尼木县| 景谷| 澄城县| 尤溪县| 郸城县| 大城县| 梁河县| 沿河| 赤水市| 黄陵县| 定边县| 易门县| 武功县| 镇原县| 宜川县| 思茅市| 乐昌市| 衡南县| 昌乐县|