让我们说我有一个接口“Car”和该接口的具体实现称为“Campervan”。我希望每辆车都有以下变量: int座位 int乘客
有人可能会认为界面看起来像这样:
interface Car{
private Integer passengers;
public Integer seats;
}
但由于几个原因,这不起作用。 Java接口不允许使用FINAL和PUBLIC以外的变量。
由于Java接口不允许公共最终变量以外的变量,我如何实现承诺所有实现接口的类(如Campervan)都具有包含这些变量的内部数据结构?公共最终变量并不总是我希望我的接口承诺。
注意:我确实理解接口的概念不包括内部状态,因此强制变量是最终的。但这是否意味着Java接口不允许承诺内部数据结构?
答案 0 :(得分:3)
该接口旨在供程序的其他部分使用,而内部数据结构则用于实现接口来决定。如果要在类层次结构中重用某些内部数据结构,则应使用抽象类。
答案 1 :(得分:2)
接口的主要目的是将抽象与实现分开。通过要求实现接口的类遵循某种实现,您无视接口的概念。你定义了接口,所以你不关心它是如何实现的,只要实现它的类做他们承诺做的事情(你不应该担心他们是如何做的)。
在您的示例中,您可以使用此界面:
interface Car{
public Integer getPassengers();
public Integer getSeats();
}
拥有Car
界面,您可以随时调用getPassengers()
方法,而无需关心类(接口的实现者)正在做什么来获得乘客数量。
答案 2 :(得分:1)
解决方案1 - 改为使用抽象类:
public abstract class Car{
private Integer passengers;
private Integer seats;
// setters and getters...
}
如果您的实现类已经扩展了其他类,那么这当然不会起作用:
解决方案2 - 将getter和setter添加到界面:
interface Car{
Integer getPassengers();
Integer getSeats();
void setPassengers(Integer value);
void setSeats(Integer value);
}
此外,您无法在界面中将某些内容标记为private
。这没有任何意义。接口的目的是使客户端代码能够访问成员,而无需知道它使用的是什么对象和实现。因此,私有成员在接口中非常无用,因为客户端代码无法以任何方式访问它。