继承的集合

时间:2011-12-15 11:48:21

标签: java collections

我有这个班级

public class Room{

private int n_bed;
private float cost;

private Collection<Client> clientlist;

public Room(int n,float c){

    n_bed = n;
    cost = c;

    clientlist = new ArrayList<Client>();
}

}

这个类继承自上面的类

public class RoomWithBar extends Room{

private Collection<Drink> drinkslist;

public RoomWithBar(int n,float cost){

    super(n,cost);

    drinkslist = new ArrayList<Drink>();
}

public Collection<Drink> getDrinksList(){

    return drinkslist;
}

public void addDrink(Drink drink){

    drinkslist.add(drink)
}

}

我的问题是:我还必须在RoomWithBar类中插入集合clientlist,否则该集合会自动继承?

6 个答案:

答案 0 :(得分:1)

派生类会自动继承该集合。

但是,由于clientlist被声明为private,派生类将无法直接访问它:您需要创建一个getter方法或更改{{1的可见性例如,clientList

答案 1 :(得分:1)

这是protected修饰符的作用。

protected Collection<Client> clientlist;

现在,clientlist可以在派生类中访问。

详细信息click here.

答案 2 :(得分:0)

clientlist是一个私有字段,因此子类无法访问它。所以在RoomWithBar课程中你也无法达到它。

当您在RoomWithBar类中调用超级构造函数时,初始化将由Room类的构造函数完成。

但我强烈建议您使用clientlist关键字声明final字段以防止未初始化字段,因为如果您忘记调用super构造函数,则clientlist字段将是null

答案 3 :(得分:0)

您将无法从Room类访问该集合,因为它是私有的。

你需要在Room类中指定与它交互的方法(比如addClient,在我看来,最好的解决方案),或者让它受到保护并在RoomWithBar类中处理它。

如果你只是改变了可见性,那么你将不得不在你将来实现的每个扩展类中实现交互(比如RoomWithJacuzzi或wtv),这不是一个很好的设计。如果您执行需要特定的行为,您始终可以覆盖处理客户端的方法,但这些方法应该在父类中定义。

答案 4 :(得分:0)

由于clientlist被声明为私有,因此您无法使用RoomWithBarRoom对象访问它们。

将其设为受保护或公开。或者在Room中声明公开方法,以添加或获取clientlist中的元素。您可以从RoomWithBar

的对象访问这些方法

答案 5 :(得分:0)

声明任何说明符对象/变量都是由派生类继承但是使用私有声明然后你不能直接访问该对象/变量