接口引用变量

use*_*247 1 java oop inheritance interface

当我尝试Car使用Colorable接口指向类的对象而不使用类car中的implements时,我没有显示任何编译错误(虽然它显示运行时错误)(问题1)并且当我尝试对类不执行同样的操作时车辆类和试图用汽车类指向汽车的对象它立即显示编译错误.为什么会这样?

问题1:

interface Colorable {}

class Vehicle {}

class Car  extends Vehicle {}

public class Tester {

  public static void main(String[] args) {

    Car c=new Car();
    Vehicle a = (Vehicle)c;

    Colorable i = (Colorable)c;

    System.out.println("Successful");
  }
}
Run Code Online (Sandbox Code Playgroud)

问题2:

interface Colorable {}

class Vehicle {}

class Car   {}

public class Tester {

  public static void main(String[] args) {

    Car c=new Car();
    Vehicle a = (Vehicle)c;

    Colorable i = (Colorable)c;

    System.out.println("Successful");
  }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

Car实现子类的实例是可能的Colorable,这就是为什么它不是编译时错误的原因.

但是,在问题2中,Vehicle并且Car它们是完全独立的层次结构,编译器知道任何Car引用都不可能是对Vehicle... 实例的引用,因此它可以在编译时拒绝它.

基本上,类和接口之间的区别在于接口可以在类型层次结构中进一步实现,而层次结构只有一个继承链,这意味着编译器可以检测到更多问题.

如果Car标记为final,编译器同样能够告诉实例Car也不可能实现Colorable,也是编译时错误.