簡體   English   中英

繼承如何在java中使用抽象類

[英]how does inheritance work with abstract classes in java

我正在編寫一小段代碼以確保我理解Java基礎知識,並且我有以下內容。

package teams1;

public abstract class Team1{
    private String sport = new String();

    public abstract String getSport();

    public abstract void setSport();
}

import teams1.*;
abstract class FootballTeam1 extends Team1{

    public String getSport(){
        return "Football";
    }

    public void setSport(){
        this.sport="Football";
    }
}

它沒有編譯,因為運動在超級類中是私有的,但我認為FootballTeam1將繼承它自己的運動副本,因為它正在擴展Team1。 任何幫助,將不勝感激。 謝謝!

你大多回答了自己的問題。 FootballTeam1無權訪問其父級的私有字段。 這就是“ 受保護 ”范圍的用途。

但是,子FootballTeam1確實有自己的字段副本。 它有父類所有字段的副本,我可以看到它會引起混淆。

這種區別的原因是模塊化。 父類的子類只能訪問父類的部分,這些部分已明確聲明它可以訪問。 這允許開發人員在面向對象的目標(稱為“ 開放/封閉原則 ”)下考慮要暴露的類的哪些部分; 也就是說,類應該是開放的擴展,但是關閉以進行修改。

例如,對類的最快“修復”是改變字段的范圍

private String sport = new String();

protected String sport = new String();

要么

public String sport = new String();

如果您不想讓子類直接訪問該字段,但確實希望允許它更改字段,則可以使用受保護的setter方法。 例如,您可以將以下內容添加到Team1

protected void setSport( String newValue ) {
    this.sport = newValue;
}

由於類變量sport是私有的,因此對於聲明它的類是私有的。擴展類不能以您嘗試的方式訪問此變量。

如果要以這種方式繼續訪問sport變量,請嘗試使變量protected (允許擴展類對變量具有可見性),否則在抽象類和擴展/實現類中使用getter和setter來調用它們。

聲明為private的Private方法,變量和構造函數只能在聲明的類本身中訪問。

在超類中聲明受Protected變量,方法和構造函數只能由其他包中的子類或受保護成員類的包中的任何類訪問。

修改后的代碼

package com.org.abstractc;
public abstract class Team1{
    // you have to change this private to protected then it will be inherited 
    // in child class.
    protected String sport = new String();   

    public abstract String getSport();

    public abstract void setSport();
}

只需將private更改為protected private表示您的子類無權訪問變量或方法,而protected允許此訪問。

私有字段只能在同一個類中訪問。 此外,繼承主要用於在具有單獨功能邏輯的派生類中定義相同的名稱方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM