从java子类调用不在父类

时间:2017-03-02 18:16:17

标签: java polymorphism

考虑以下基类/派生类:

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方法必须存在于基类中才能编译,因为m5Car类型,所以如果我包含getTopSpeedCar然后m5.getTopSpeed();很好地编译。

我的问题是:

  1. 为什么错误“找不到符号 - 方法getTopSpeed()”发生在编译时而不是运行时?
  2. 为什么“后期绑定”不会阻止此错误?
  3. 假设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 中被覆盖,或者只是“知道”它已经从编译器中被覆盖并直接使用过度使用的方法?

2 个答案:

答案 0 :(得分:2)

  1. Java是静态类型语言,因此在编译时应该知道变量类型。如果编译器已知的类型没有公开这样的方法 - 则编译失败。正是因为不让它运行的原因。

  2. 为什么要这样?它只是发现方法体迟到了,而不是签名。但是,静态类型意味着必须在编译时满足签名。

  3. 在运行时,JVM尝试查找最具体的实现。在SportsCar中,在您的情况下。如果它是从父级继承但在子级中不存在 - 则使用父级代码。

  4. 如果您需要从变量类型中缺少的特定子项调用方法 - 您可以在运行时将其强制转换为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.

相关问题