0

そのため、レッスンに深く入る前に、オーバーライドを理解しようとしています。TheNewBoston (bucky) がオーバーライドについて説明しているのを見ましたが、それが正しいかどうかはわかりません。誰かが私をスポットチェックして、私を正しい道に導いてくれませんか?

バッキーがスーパークラス内のインスタンス変数を保護する必要があったことを覚えていません。しかし、サブクラスを作成しているときに、Eclipse によってインスタンス変数を保護された変数に変換する必要がありました。

スーパークラスの連絡先:

public class Contacts
{
    protected String fname;
    protected String lname;
    protected String email;
    protected String phone;

    public Contacts(String fname, String lname, String email, String phone)
    {
        this.fname=fname;
        this.lname=lname;
        this.email=email;
        this.phone=phone;

    }

    public String getfname()
    {
        return fname;
    }

    public void setfname(String first)
    {
        this.fname=first;       
    }

    public String getlname()
    {
        return lname;
    }

    public void setlname(String last)
    {
        this.lname=last;
    }

    public String getemail()
    {
        return email;
    }

    public void setemail(String e)
    {
        this.email=e;
    }

    public String getphone()
    {
        return phone;
    }

    public void setphone(String num)
    {
        this.phone=num;
    }

    public String getFullName()
    {
        String full=fname+" "+lname;
        return full;
    }

サブクラスフレンド:

public class Friend extends Contacts
{
    private String dob;


    public Friend(String fname, String lname, String email, String phone)
    {
        super(fname, lname, email, phone);
    }


    public String getDob()
    {
        return dob;
    }


    public void setDob(String dob)
    {
        this.dob = dob;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString()
    {
        return fname+", "+lname+", "+email+", "+phone+", "+dob;
    }




}

サブクラス BusinessAssociate:

public class BusinessAssociate extends Contacts
{
    private String title;
    private String position;
    private String company;
    private String full;

    public BusinessAssociate(String fname, String lname, String email,
            String phone)
    {
        super(fname, lname, email, phone);

    }

    public String getTitle()
    {
        return title;
    }

    public void setTitle(String title)
    {
        this.title=title;
    }

    public String getCompany()
    {
        return company;
    }

    public void setCompany(String company)
    {
        this.company=company;
    }

    public String getPosition()
    {
        return position;
    }

    public void setPosition(String position)
    {
        this.position=position;
    }

    /* (non-Javadoc)
     * @see Contacts#getFullName()
     */
    @Override
    public String getFullName()
    {
        full=title+" "+fname+" "+lname;
        return full;
    }

    /* (non-Javadoc)
     * @see java.lang.Object#toString()
     */
    @Override
    public String toString()
    {
        return full+", "+email+", "+phone+", "+company+", "+position;
    }




}
4

1 に答える 1

2

あなたのコードのオーバーライドは私には正しいように見えます。

ただし、オーバーライドできるのはインスタンス メソッドのみであることに注意してください。コンストラクター、フィールド、および静的メソッドはオーバーライドできません。

コメントは次のように尋ねます。

「フィールドをオーバーライドできない」とはどういう意味ですか? これは私にはオーバーライドのように見えます:

    class A { protected int a = 1; } 
    class B extends A { protected int a = 2; }`. 

これを明確にしていただけますか?

それはオーバーライドではありません。ここにあるのは、スーパークラスのフィールドB隠すAサブクラスのフィールドです。インスタンスを作成すると、値が異なるB2 つの異なるaフィールドが作成されます。

参考:https ://stackoverflow.com/a/11971061/139985


...しかし、なぜ日食は各サブクラスにコンストラクターを入れさせたのですか? YouTubeの動画ではそうではありませんでした。

Eclipse は JLS を実装しており、JLS はそれを必要とするためです。おそらく、YouTube ビデオの例とは異なる点があります。

あなたの例が設計されている方法では、基本クラスContactsにはサブクラスに共通/使用されるフィールドがあり、コンストラクターでそれらのフィールドを(自然に)初期化します。名前、電子メール、および電話フィールドを持つ役に立たないインスタンスContactsを作成できるようになるため、引数なしのコンストラクターは使用しないでください (使用しないでください) 。Constantsnull

ただし、Contacts引数のないコンストラクターがないということは、サブクラスには明示的なコンストラクター宣言が必要であることを意味します。Java の仕組みでは、コンストラクターを宣言しない場合、クラスはデフォルトの引数のないコンストラクターを取得します。ただし、そのデフォルトのコンストラクターは、スーパークラスに no0args コンストラクターがある場合にのみ可能です。この場合、そうではありません。

したがって、サブクラスがコンストラクターを宣言することを主張した Eclipse は正しかったのです。Java コンパイラは、引数なしのコンストラクタを に追加するという代替手段にも満足していたでしょうContacts。しかし、これは間違った解決策です。フィールドを使用しBusinessAssociateFriendインスタンスが作成されるためです。null


しかし、サブクラスを作成しているときに、Eclipse によってインスタンス変数を保護された変数に変換する必要がありました。

それがなぜ起こったのかは完全には明らかではありません (以前に何があったかはわかりません!!) が、サブクラスがスーパークラスのフィールドを直接参照している場合、スーパークラスのフィールドには許可する適切な「アクセス」修飾子が必要です。これ。(たとえば、サブクラスはスーパークラスprivateのフィールドを直接参照することはできません。Java 言語仕様ではこれを禁止しています。)

于 2013-03-30T02:53:56.320 に答える