Java对象类型向上转型和向下转型
基础知识:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象,所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,也就是无法直接访问到它(子类可以通过调用父类的public声明的get方法来获取父类的private属性,但无法访问父类的private方法)。同时子类可以对继承的方法进行重写(@Override),并且新建自己独有的方法。
1.向上转型:
假设有一个Fruit类,Fruit类中有一个show()方法,代码如下:
[code]class Fruit{ public void show() { System.out.println("this is a fruit"); } }
有一个Apple类继承自Fruit类,该类有自己的方法test(),并且重写了父类的show()方法,代码如下:
[code]class Apple extends Fruit{ @Override public void show() { System.out.println("this is a apple"); } public void test() { System.out.println("i am a apple"); } }
实例化Apple类,并新建一个Fruit类的引用变量引用该实例,调用实例的show()方法:
[code]Fruit fruit = new Apple(); fruit.show();
结果为:
调用实例的test()方法:
[code]fruit.test();
结果报错:
分析:这里用到了向上转型,换言之,就是用父类的引用变量去引用子类的实例,这是允许的。当向上转型之后,父类引用变量可以访问子类中属于父类的属性和方法,但是不能访问子类独有的属性和方法。例子中由于子类重写了父类的show()方法,所以调用的show()方法是子类的show()方法,输出结果为:“this is a apple”,而调用子类的test()方法则会报错。
2.向下转型
并不是所有的对象都可以向下转型,只有当这个对象原本就是子类对象通过向上转型得到的时候才能够成功转型。
实例化Apple类,并新建一个Fruit类的引用变量“fruit”引用该实例,然后新建一个Apple类的引用变量,引用向下转型的“fruit”变量,代码如下:
[code]Fruit fruit = new Apple(); Apple apple = (Apple) fruit;
上述代码是允许的,因为fruit引用的对象原本就是Apple对象向上转型得到的,在对fruit向下转型后得到的还是Apple类的对象,能够被Apple类的引用变量引用。
假设有一个Orange类继承自Fruit类,代码如下:
[code]class Orange extends Fruit{ @Override public void show() { System.out.println("this is a Orange"); } public void test() { System.out.println("i am a Orange"); } }
实例化Apple类,并新建一个Fruit类的引用变量“fruit”引用该实例,然后新建一个Orange类的引用变量,引用向下转型的“fruit”变量,代码如下:
[code]Fruit fruit = new Apple(); Orange orange = (Orange) fruit;
上述代码虽然能够编译成功,但是在运行的时候会报错,因为fruit对象是由Apple对象向上转型得到的,只能够向下转型成Apple对象,不能够向下转型成Orange对象。
3.转型的好处
通过向上向下转型肯定是有好处的,比如可以减少编程代码。
假设在主类中定义了一个run()方法,该方法传入一个Fruit参数,并调用了Fruit对象的show()方法,代码如下:
[code]public static void run(Fruit fruit) { fruit.show(); }
在main()方法中的代码如下:
[code]public static void main(String[] args) { run(new Fruit()); run(new Apple()); run(new Orange()); }
上述代码中,调用run()方法时的参数不仅是Fruit对象,也可以是Apple对象和Orange对象,当传入的是Apple对象和Orange对象时,就会向上转型成Fruit对象,但是调用的show()方法还是Apple对象和Orange对象的show()方法。这样就不需要在主类中同时重载三个run()方法,减少了代码量。
- JAVA_多态性演示a____自动向上转型、向下转型、检查对象是否为某个类型(instanceof)
- JAVA_多态性演示a____自动向上转型、向下转型、检查对象是否为某个类型(instanceof)
- java基础:对象的向上转型/向下转型; 基本类型的 向上转型/向下转型实例(窄化)
- JAVA对象 向上转型upcasting,向下转型downcasting
- 重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)
- 关于Java向上转型和向下转型以及类型还原
- 对象类型的转换(向上转型和向下转型)
- java 对象的向上、向下转型
- java多态的向上转型与向下转型(与编译时类型与运行时类型有关)
- JAVA对象向上转型和向下转型
- java4Android(6)函数的复写(override)/对象的转型(向上转型/向下转型)
- 黑马程序员-Java 类型转换与向上、向下转型
- Java向上转型与向下转型(子类的对象赋给父类的)
- JavaSE(五)JAVA对象向上转型和向下转型
- java 对象向上转型&&向下转型
- 重新认识java(五) ---- 面向对象之多态(向上转型与向下转型)
- Java 转型(向上或向下转型)详解及简单实例
- Java 基础(8)—— 向上转型、向下转型、动态绑定、静态绑定
- java 对象的向下转型
- JAVA向上转型和向下转型(二)