考虑以下基类/派生类:
public class Car {
private int cylinders;
public Car(int cyl) {
cylinders = cyl;
}
public int getCylinders() {
return cylinders;
}
}
public class SportsCar extends Car {
private int topSpeed;
public SportsCar(int cyl, int top) {
super(cyl);
topSpeed = top;
}
public int getTopSpeed() {
return topSpeed;
}
}
现在,请考虑以下两个对象:
SportsCar lambo = new SportsCar(8,255);
Car m5 = new SportsCar(10,240);
以下方法调用编译正常:
lambo.getTopSpeed();
但是这个方法调用会出现错误“无法找到符号 - 方法getTopSpeed()”
m5.getTopSpeed();
现在我明白了getTopSpeed
方法必须存在于基类中才能编译,因为m5
是Car
类型,所以如果我包含getTopSpeed
在Car
然后m5.getTopSpeed();
很好地编译。
我的问题是:
getTopSpeed
Car
在程序运行时在getTopSpeed
中实现(编译),编译器是否首先检查Car
中是否存在SportsCar
然后检查它是否在let Identifier1 = "Cell3"
var cell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier(Identifier1)
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyleDefault, reuseIdentifier: Identifier1)
cell.textLabel.lineBreakMode = NSLineBreakByCharWrapping
cell.textLabel.numberOfLines = 0
cell.textLabel.font = UIFont(name: "Helvetica", size: 15.0)
}
var txtDate: UILabel = UILabel(frame: CGRectMake(13.0, 26.0, 294.0, 30.0))
txtDate.text = stringFromDate
txtDate.userInteractionEnabled = false
txtDate.font = UIFont(name: "Helvetica", size: 15.0)
cell.contentView.addSubview(txtDate)
return cell
中被覆盖,或者只是“知道”它已经从编译器中被覆盖并直接使用过度使用的方法? 答案 0 :(得分:2)
Java是静态类型语言,因此在编译时应该知道变量类型。如果编译器已知的类型没有公开这样的方法 - 则编译失败。正是因为不让它运行的原因。
为什么要这样?它只是发现方法体迟到了,而不是签名。但是,静态类型意味着必须在编译时满足签名。
在运行时,JVM尝试查找最具体的实现。在SportsCar中,在您的情况下。如果它是从父级继承但在子级中不存在 - 则使用父级代码。
如果您需要从变量类型中缺少的特定子项调用方法 - 您可以在运行时将其强制转换为ClassCastException。
答案 1 :(得分:1)
这是因为当编译器看到这个时:
SportsCar lambo = new SportsCar(8,255);
Car m5 = new SportsCar(10,240);
它知道lambo是一辆SportsCar,但只知道m5是一辆Car。如果你想获得m5的最高速度,你必须先将它投射到SportsCar:
((SportsCar)m5).getTopSpeed();
然而,大多数时候我看过铸造,变量首先被转换为另一个变量:
SportsCar sportsM5 = (SportsCar)m5;
sportsM5.getTopSpeed();
This aspect of polymorphism in Java confused me once when I was passing an object to a method.