2014-02-20 35 views
2

我想声明一个抽象类,它有一个变量在其子类中被初始化。例如,假设我们有一个名为Country的抽象类和一个名为United States的子类。 (我知道,通常你会让美国成为国家的一个实例,但我只是以此为例,所以我们假设这是我们要做的设计。)我想要一个叫做bigCities的public final Set<String>但在国家未初始化,但将在美国初始化,如{“纽约”,“洛杉矶”,“芝加哥”}。我怎么做到这一点? (我很抱歉,如果它之前被问过,但我的问题是很难制定精确的搜索条件。每当我尝试搜索Google或StackOverflow时,我得到的问题类似但不是什么我在找。)如何在Java中的抽象类中声明未初始化的变量?

+5

我可能有超类,它是各种参数的构造函数,所以子类必须明确地具有价值 – njzk2

+0

你尝试过什么叫呢?堆栈溢出是为了在用尽自己的资源后帮助解决问题。这是一个非常基本的问题,所以虽然提供答案很容易,但答案不会解决潜在的困惑(因为我们无法看到卡住的位置) – gravityplanx

+0

我有50个这样的问题就像bigCities一样。我宁愿不必将所有的函数都作为参数,因为这会使代码看起来非常混乱。有没有办法解决这个问题? – Tony

回答

3

如果要定义你的财产bigCitiesfinal它必须在类的构造函数中被初始化,无论是Country或你的情况UnitedStates

public abstract class Country { 
    public final Set<String> bigCities; 
    public Country(Set<String> bigCities) { 
    this.bigCities = bigCities; 
    } 
} 

在这种情况下Country子类必须调用与指定参数的父类的构造函数。

1

有两种方法可以做到这一点。你可以让Country构造函数有一个名为bigCities的参数,而像UnitedStates这样的子类可以调用super(cities,otherArgs)。

或者,您也可以使一个抽象的方法,这样

protected abstract Set<String> getBigCities(); 

,然后在国家的构造,设置bigCities该方法的实现。

bigCities = getBigCities(); 
+0

在这种情况下,您不能创建抽象方法,因为属性'bigCities'被声明为'final'。 – Manuel

+0

如你所描述的,在构造函数中调用非final方法也是一种不好的做法;对于他们在子类中的行为没有保证。 –

+0

@Manuel确定吗?我只是跑了一个快速测试,似乎工作正常。 – kabb

0
abstract class Country { 

    public final Set<String> bigCities; 

    protected Country(String... bigCities) { 
     this.bigCities = new HashSet<String>(Arrays.asList(bigCities)); 
    } 

} 

class USA extends Country { 
    USA() { 
     super("NY", "Chicago"); 
    } 
}