【发布时间】:2020-07-31 13:49:07
【问题描述】:
我有一个小例子,我有一个如下界面
public interface Chair {
int getHeight();
String getType();
int getPrice();
}
还有一个班级:
public class ExpensiveChair implements Chair {
private int height;
private int price;
static private String type = "Expensive";
public ExpensiveChair(int height, int price){
this.height = height;
this.price = price;
}
public void setHeight(int height) {
this.height = height;
}
@Override
public int getHeight() {
return this.height;
}
@Override
public String getType() {
return this.type;
}
@Override
public int getPrice() {
return this.price;
}
}
但是如果我做类似的事情
Chair chair = new ExpensiveChair(1, 2);
我不能打电话
chair.setHeight(5)
我需要先进行类型转换吗?
((ExpensiveChair) chair).setHeight(1);
为什么我需要显式地转换它或者我不能调用该方法?
【问题讨论】:
-
因为类型
Chair没有方法setHeight。只有ExpensiveChair可以 -
@QBrute 所以本质上它不知道对象在运行前是 ExpensiveChair 类型的?因为如果我执行chair.getClass 之类的操作,那么它会显示 ExpensiveChair,但我猜它会在运行时发生
-
不是这样的。这是因为您说创建的实例是
Chair类型。想象一下,您有另一个类CheapChair也扩展了Chair,但没有setHeight方法。你可以做Chair chair = new CheapChair();。那么chair.setHeight(5)会做什么呢? -
@QBrute 那么它可以看到对象是CheapChair,看看它是否有一个方法
setHeight然后采取相应的行动? -
这不是它的工作方式。在您声明静态类型为
Chair的变量时,您只能在该实例上调用您在Chair接口中定义的方法。您唯一能做的就是将setHeight方法添加到Chair接口,或者像您已经做的那样将其转换为更具体的类型ExpensiveChair
标签: java inheritance interface casting polymorphism