父类与子类之间的转换

  子类转换成父类:可以。  


  父类转换成子类:不可以。

 

  如果父类对象的引用指向的实际是一个子类的对象,那么父类对象的引用可以强制转化成子类对象的引用。如:  
  Parent   p=new   Son()  
  Son   s=(Son)p;  --正确

 

  Parent   p=new   Parent()  
  Son   s=(Son)p;  --错误

 

因为继承的概念就是子孙类会越来越比祖先类详细,所以可以将子孙类强制转换成祖先类,因为祖先有的行为子孙类示例都有了(重新定义的或者是默认的);但是当将祖先类示例强制转换成子孙类示例的时候,一些子孙类有的行为祖先是没有的(即使的是默认的实现也没有)。

### 父类子类之间的类型转换方法 在面向对象编程中,父类子类的类型转换是多态性的重要体现。以下详细介绍了向上型(从子类父类)和向下型(从父类子类)的方法。 #### 向上型 向上型是指将子类对象赋值给父类引用。这种转换是隐式的,无需强制类型转换。例如: ```java class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } public class Main { public static void main(String[] args) { // 向上型 Animal animal = new Dog(); // 子类对象赋值给父类引用 animal.makeSound(); // 输出 "Dog barks",因为调用了子类重写的方法[^1] } } ``` #### 向下型 向下型是指将父类引用的对象显式转换子类类型。这种转换需要使用强制类型转换,并且只有当父类引用实际指向的是子类对象时才安全。例如: ```java public class Main { public static void main(String[] args) { Animal animal = new Dog(); // 向上型 if (animal instanceof Dog) { // 检查类型是否兼容 Dog dog = (Dog) animal; // 向下型 dog.makeSound(); // 调用子类方法 } } } ``` 如果尝试将父类引用的对象转换为不兼容的子类类型,则会抛出 `ClassCastException` 异常[^2]。 #### 类型检查安全性 为了确保向下型的安全性,可以使用 `instanceof` 关键字来检查对象的实际类型。例如: ```java if (animal instanceof Dog) { Dog dog = (Dog) animal; dog.makeSound(); } else { System.out.println("animal is not an instance of Dog"); } ``` #### 动态绑定多态性 当通过父类引用调用被子类重写的方法时,Java 会在运行时动态绑定到子类的具体实现。这种机制称为动态绑定或多态性[^2]。 ```java Animal animal = new Dog(); animal.makeSound(); // 动态绑定到 Dog 的 makeSound 方法 ``` #### 注意事项 - 向上型丢失了子类特有的方法和属性,但保留了继承自父类的公共部分。 - 向下型可能会导致 `ClassCastException`,因此必须进行类型检查。 - 多态性的核心在于子类可以重写父类的方法,从而实现不同的行为[^2]。 --- ### 示例代码 以下是一个完整的示例,展示父类子类之间的类型转换: ```java class Vehicle { public void drive() { System.out.println("Vehicle is driving"); } } class Car extends Vehicle { @Override public void drive() { System.out.println("Car is driving"); } public void honk() { System.out.println("Car is honking"); } } public class Main { public static void main(String[] args) { // 向上型 Vehicle vehicle = new Car(); vehicle.drive(); // 输出 "Car is driving" // 向下型 if (vehicle instanceof Car) { Car car = (Car) vehicle; car.honk(); // 输出 "Car is honking" } } } ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值