父子对象之间的转换分为了向上转型和向下转型,它们区别如下:
- 向上转型 : 通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换
- 向下转型 : 通过父类对象(大范围)实例化子类对象(小范围),这种属于强制转换
示例:Animal动物类代码解释如下:
package com.wjledu.poly_.detail_;
public class Animal {
String name = "动物";
int age = 10;
public void sleep() {
System.out.println("睡");
}
public void run() {
System.out.println("跑");
}
public void eat() {
System.out.println("吃");
}
public void show() {
System.out.println("hello,您好");
}
}
示例:Cat类继承Animal代码如下:
package com.wjledu.poly_.detail_;
public class Cat extends Animal{
public void eat() {//方法重写
System.out.println("猫吃鱼");
}
public void catchMouse() {//Cat特有方法
System.out.println("猫抓老鼠");
}
}
示例:Dog类继承Animal代码如下:
package com.wjledu.poly_.detail_;
public class Dog extends Animal{//Dog是Animal的子类
}
示例:PolyDetail实现两个对象类存在继承关系代码与注解如下:
package com.wjledu.poly_.detail_;
public class PolyDetail {
public static void main(String[] args) {
//多态的向上转型:父类的引用指向了子类的对象
//语法:父类类型引用名 = new 子类父类();
Animal animal = new Cat();
Object obj = new Cat();//可以,因为Object 也是 Cat的父类
//向上转型调用方法分规则如下:
//(1) 可以调用父类所有的成员方法(需遵守访问权限)
//(2) 但是不能调用子类的特有的成员。不能调用的原因如下:
//(3) 因为在编译阶段,能调用哪些成员,是由编译类型来决定的
//animal.catchMouse();//错误
//(4) 最终运行结果看子类的具体实现,即调用方法时,按照从子类(运行类型)开始查找方法,
//然后调用,规则和前面讲的方法调用规则一致。
System.out.println("===========向上转型============");
animal.eat(); //猫吃鱼
animal.run(); //跑
animal.show();//hello,您好
animal.sleep();//睡
//向上转型的总结:子类重写了父类方法,调用子类,没有重写掉
//只要理解编译和运行这两个规则就不会绕晕了。
//希望可以调用Cat的 catchMouse()方法
//多态的向下转型
//(1) 语法: 子类类型 引用名 = (子类类型)父类引用;
//问题?cat的编译类型Cat,运行类型是Cat
System.out.println("===========向下转型============");
Cat cat = (Cat) animal;
cat.catchMouse();//猫抓老鼠
//(2)要求父类的引用必须指向的是当前目标类型的对象
Dog dog = (Dog) animal;//不可以
//只有编译类型和运行类型不一致才需要向下转型
System.out.println("ok~~~");
}
}
最终结果实现如下:

本文探讨了Java中父子对象间的转换,包括向上转型(自动转换)和向下转型(强制转换)。通过示例代码详细解释了这两种转换方式,并展示了实际应用的实现结果。
675

被折叠的 条评论
为什么被折叠?



