Java继承合法性判断:Ford继承Car时哪些表达式合法?
咱们结合Java的继承与转型规则,逐个拆解这些代码的合法性:
Car x = new Car();
合法。父类引用直接指向父类的实例,这是最基础的对象创建方式,完全符合语法规则。Ford y = new Ford();
合法。子类引用指向子类自己的实例,也是常规的对象初始化操作,没有问题。x = y;
合法。这是Java里的向上转型:因为Ford是Car的子类,所有Ford实例本质上都是Car的实例,所以子类实例可以直接赋值给父类引用,编译器会自动完成这个转换,不需要额外操作。你可以理解成“福特车是车,所以把福特车当成车来用完全没问题”。y = x;
不合法。这属于向下转型:父类引用x指向的对象不一定是Ford实例(比如这里x最初指向的是Car本身的实例),Java不允许直接把父类引用赋值给子类引用,必须显式添加强制类型转换,写成y = (Ford)x;才能通过编译(不过如果x实际指向的不是Ford实例,运行时会抛出ClassCastException)。简单说就是“车不一定是福特车,不能直接把任意一辆车当成福特车”。y = new Car();
不合法。子类引用不能直接指向父类实例,因为Car实例并不具备Ford子类的特有属性和方法,这种转换在编译阶段就会报错,哪怕强制转换,运行时也会抛出类型转换异常。毕竟“普通车不是福特车,不能把普通车当福特车”。x = new Ford();
合法。还是向上转型的场景,子类Ford的实例赋值给父类Car的引用,符合多态的设计原则,编译器自动允许这种转换。
内容的提问来源于stack exchange,提问作者NarrowSky

