簡體   English   中英

Java 在子類中初始化的超類字段

[英]Java superclass field initialised in subclasses

我有一個帶有私有字段“變量”的 Java 超類,它的所有子類都以相同的方式使用“變量”。 除了在每個子類中,“變量”在初始化時的計算方式不同。 我在哪里最好存儲這個字段以及如何最好地初始化它?

這是我的代碼:

public abstract class SuperClass {

    private int variable;

    public abstract String getName();

    public void printVariable() { System.out.println(variable); }

    public int squareVariable() { 
        variable *= variable; 
        return variable;
    }

}
public class SubClass1 extends SuperClass {

    private String name;

    public SubClass1(int param) {
        name = "SubClass1";

        super.variable = param + 1;
        // How do I make this better?
    }

    public String getName() { return name; }

}
public class SubClass2 extends SuperClass {

    private String name;

    public SubClass2(int param) {
        name = "SubClass2";

        super.variable = param / 2;
        // How do I make this better?
    }

    public String getName() { return name; }

}

正如你所看到的,現在我使用 super.variable,但是我必須讓“變量”受到保護,這種方法對我來說似乎不是最優的。 這樣做的正確方法是什么? 我應該在超類中定義一個 setter 嗎? 或者我可以在處理這個的超類中定義一個構造函數嗎? 或者我應該分別在每個子類中存儲“變量”嗎? 或者我應該像這樣保持它並保護“變量”嗎?

首先,問題中的代碼無法編譯( The field SuperClass.variable is not visible ),因此它們是不好的例子。

variablename都存儲在SuperClass中,並在構造函數中初始化它們。

public abstract class SuperClass {

    private String name;
    private int variable;

    protected SuperClass(String name, int variable) {
        this.name = name;
        this.variable = variable;
    }

    public String getName() { return name; }

    public void printVariable() { System.out.println(variable); }

    public int squareVariable() { 
        variable *= variable; 
        return variable;
    }

}
public class SubClass1 extends SuperClass {

    public SubClass1(int param) {
        super("SubClass1", param + 1);
    }

}
public class SubClass2 extends SuperClass {

    public SubClass2(int param) {
        super("SubClass2", param / 2);
    }

}

暫無
暫無

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

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