[英]How to define child static class which extends parent abstract?
我需要一個父公共抽象類,它將有多個子公共靜態類。 我只需要一個Weapon類的一個實例,一些靜態類Bow,Sword <etc,它們擴展了父類,並且也只能存在於一個實例中(至少我需要能夠得到它們的靜態類)。 怎么做得好?
public abstract class Weapon {
...
}
public static class Bow extends Weapon {
static String type = "Bow ";
static int damage = 10;
}
public static class Sword extends Weapon {
static String type = "Sword";
static int damage = 10;
}
得到錯誤:
Illegal modifier for the class Sword; only public, abstract & final are permitted
我刪除了靜態它工作:
public final class Sword extends Weapon {
static String type = "Sword";
static int hitPointsTaken = 10;
}
我可以編譯這個System.out.println( Sword.type );
但不是這個System.out.println( Weapon.Sword.type );
。 這是否意味着我無法通過父抽象訪問孩子?
如果您必須實現此模型,那么您正在尋找嵌套:
public abstract class Weapon {
public static class Bow extends Weapon {
static String type = "Bow ";
static int hitPointsTaken = 10;
}
}
在Java中,只有嵌套類可以是靜態的,並且它並不意味着你認為它意味着什么。 如果某些事物只有一個實例,那么你真正想做的是使用Singleton模式: http : //en.wikipedia.org/wiki/Singleton_pattern#Example
您不能從父類范圍聲明公共靜態類。 嘗試這樣做
public abstract class Weapon {
public abstract void usage();
public static class Sword extends Test{
@Override
public void usage() {
// TODO Auto-generated method stub
}
}
}
通過將Weapon類的構造函數設置為private並使用getInstance()方法創建類的單個實例,可以實現一個實例。 這被稱為Singleton模式,但是如果你的設計確實需要其他方法,請將其設為單例,因為它會使你的代碼難以編寫測試以及將來的更改。
如果一個對象只能存在於一個實例中(即我的工作室中只有一把劍),那並不意味着它應該是一個靜態類 。 它應該仍然是一個對象。 如果通過一些宇宙事件你最好的朋友鐵匠會給你一個免費的Sword
明天怎么辦? 那你會做什么?
如果要靜態訪問Bow類的單個實例,可以使Bow類具有非公共構造函數並初始化它的公共靜態實例。 ( public static Bow THE_BOW = new Bow(...);
)這應該照顧你的靜態和繼承欲望。 如果這沒有意義,請告訴我,我將提供一個代碼示例。
我想你很想理解static關鍵字的含義。 我是Java的新手,所以我必須自己去查找。 (這是我瀏覽這個網站的原因之一......我也學到了很多東西)。 我發現了這個:Java中的靜態秘密,我的書簽中的示例網站詳細解釋了static關鍵字。 祝你的項目好運。
這不是enum
模式嗎?
public enum Weapon {
Bow(10),
Sword(10);
private int damage;
Weapon (int damage) {
this.damage = damage;
}
public int getDamage () {
return damage;
}
}
添加 ...或更顯着
public enum Weapon {
Bow(10) {
@Override
public void strike(Warrior warrior) {
// Inflict the normal damage.
super.strike(warrior);
// Sometimes also sicken.
if ( Math.random() > .95 ) {
warrior.sicken(Illness.ArrowInTheKnee);
}
}
},
Sword(10) {
@Override
public void strike(Warrior warrior) {
// Inflict the normal damage.
super.strike(warrior);
// Sometimes also sicken.
if ( Math.random() > .75 ) {
warrior.sicken(Illness.StabInTheBack);
}
}
};
// Normal damage inflicted.
private int damage;
Weapon(int damage) {
this.damage = damage;
}
public int getDamage() {
return damage;
}
public void strike(Warrior warrior) {
warrior.inflict(damage);
}
// Placeholder
public interface Warrior {
public void inflict(int damage);
public void terrorise(int fear);
public void sicken (Illness illness);
}
enum Illness {
StabInTheBack,
ArrowInTheKnee;
}
}
最好的方法是使用Singleton模式為你的“階級武器”。
使您的構造函數私有,並使用getInstance()方法來檢索您的Weapon實例。 在此之后創建Bow和Sword的子類。
你可以使用子類作為靜態類,如下所示
public class Bow extends Weapon {
private static Bow object = null;
public Bow(){
object = this;
}
public static getObjectAsStatic(){
return object;
}
}
現在,您可以像Bow.getObjectAsStatic()一樣使用“Bow.getObjectAsStatic()”調用任何類成員.classMembers
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.