interview - java new abstract class



Java中的抽像變量? (8)

我來自c#,這很容易,而且可能。

我有這個代碼:

public abstract class clsAbstractTable {

    public abstract String TAG;
    public abstract void init();

}

但是Eclipse告訴我我使用非法修改器。

我有這堂課:

public class clsContactGroups extends clsAbstractTable {


}

我希望以這種方式定義變量和方法,Eclipse 提示我 ,我沒有實現抽像變量和方法。

我如何定義我的抽像類,以便提示我實現摘要?

編輯1

我將為不同的db表創建不同的類。 每個類都應該有自己的TABLENAME變量,沒有例外。 每當我創建一個擴展抽像類的新類時,我必須確保這個變量是靜態的。

然後在抽像類中我將有一個方法,例如:init();

如果在這個init()方法中我調用TABLENAME,它應該從子類中獲取值。

這樣的事情也應該成功

String tablename=(clsAbstract)objItem.TABLENAME;
// where objItem can be any class that extended clsAbstract;

編輯2

我希望在每個類中定義一個常量(靜態),其名稱用abstract定義。

  • 我在abstract中定義變量TABLENAME,但沒有給出值。
  • 我創建了一個clsContactGroups,我應該提示我實現TABLENAME,這是獲取一些數據的地方。 例如:TABLENAME =“contactgroups”;
  • 我創建了第二個類clsContacts,我應該提示我實現TABLENAME,這是獲取一些數據的地方。 例如:TABLENAME =“contacts”;
    等等...

https://code.i-harness.com


不,Java不支持抽像變量。 它也沒有多大意義。

對於您期望子類要做的變量的“實現”有什麼具體的改變?

當我在基類中有一個abstract String變量時,子類應該怎麼做才能使它成為非抽象的?


只需將此方法添加到基類

public abstract class clsAbstractTable {

    public abstract String getTAG();
    public abstract void init();

}

現在,擴展基類(並且不希望是抽象的)的每個類都應該提供TAG

您也可以選擇BalusC的答案


在抽像類中定義構造函數,該構造函數設置字段,以便具體實現符合調用/覆蓋構造函數所需的規範。

例如

public abstract class AbstractTable {
    protected String name;

    public AbstractTable(String name) {
        this.name = name;
    }
}

當您擴展AbstractTable ,在添加一個調用super("somename")的構造函數之前,該類將不會編譯。

public class ConcreteTable extends AbstractTable {
    private static final String NAME = "concreteTable";

    public ConcreteTable() {
        super(NAME);
    }
}

這樣,實現者需要設置name 。 這樣,您還可以在抽像類的構造函數中執行(null)檢查,以使其更加健壯。 例如:

public AbstractTable(String name) {
    if (name == null) throw new NullPointerException("Name may not be null");
    this.name = name;
}

將代碼更改為:

public abstract class clsAbstractTable {
  protected String TAG;
  public abstract void init();
}

public class clsContactGroups extends clsAbstractTable {
  public String doSomething() {
    return TAG + "<something else>";
  }
}

這樣,所有繼承此類的類都將具有此變量。 你可以做200個子類,但每個子類都有這個變量。

附註:不要使用CAPS作為變量名; 常識是所有大寫標識符都是指常量,即不可更改的數據。


我認為你的混淆是C#屬性與字段/變量。 在C#中,即使在抽像類中也無法定義抽象字段。 但是,您可以定義抽象屬性,因為它們是有效的方法(例如,編譯為get_TAG()set_TAG(...) )。

正如一些人提醒的那樣,你的類中永遠不應該有公共字段/變量,即使在C#中也是如此。 幾個答案暗示了我的建議,但還沒有說清楚。 您應該使用getTAG()將您的想法轉換為Java作為JavaBean屬性。 那麼你的子類必須實現這個(我也編寫了一個帶有表類的項目)。

所以你可以有一個像這樣定義的抽像類......

public abstract class AbstractTable {

    public abstract String getTag();
    public abstract void init();

    ...
}

然後,在任何具體的子類中,您需要定義一個靜態最終變量(常量)並從getTag()返回該變量,如下所示:

public class SalesTable extends AbstractTable {

    private static final String TABLE_NAME = "Sales";

    public String getTag() {
        return TABLE_NAME;
    }

    public void init() {
        ...
        String tableName = getTag();
        ...
    }

}

編輯

您不能覆蓋繼承的字段(在C#或Java中)。 你也不能覆蓋靜態成員,無論它們是字段還是方法。 所以這也是最好的解決方案。 我更改了上面的init方法示例,以顯示如何使用它 - 再次,將getXXX方法視為屬性。


有兩種方法可以在java中定義抽象屬性而不將屬性標記為抽象。

第一種方式:在抽像類中定義參數化構造函數,如:

public abstract class clsAbstractTable {
       private String TAG;
       public clsAbstractTable (String TAG) {
            this.TAG= TAG;
       }
}

在抽像類中定義參數化構造函數時,子類被強制定義自己的構造函數並調用超級構造函數,從而傳遞自己的TAG

第二種方式:將屬性定義為getter方法,例如:

public abstract class clsAbstractTable {
    public abstract String getTAG();
}

這樣, TAG屬性的值被委託為由每個具體類定義。

來源: 在java中定義一個抽象屬性


由於沒有變量的實現,它不能是抽象的;)


要添加每類元數據,可能註釋可能是正確的方法。

但是,您無法在界面中強制執行註釋,就像您無法強制執行靜態成員或存在特定構造函數一樣。





abstract