java向上转型与向下转型详解
本文实例为大家分享了java向上转型与向下转型的具体代码,供大家参考,具体内容如下
基础知识:Java中的继承机制使得一个类可以继承另一个类,继承的类称为子类,被继承的类称为父类。在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象,所以子类可以继承父类中所有的属性和方法,包括private修饰的属性和方法,但是子类只是拥有父类private修饰的属性和方法,却不能直接使用它,也就是无法直接访问到它(子类可以通过调用父类的public声明的get方法来获取父类的private属性和private方法)。同时子类可以对继承的方法进行重写(@Override),并且新建自己独有的方法。
1.向上转型:
父类 : class Fruit {}
子类 : class Apple extends Fruit{}
创建向上转型对象 fruit ;
Fruit fruit = new Apple();
Apple 向上转型为父类
如果 Apple 中有重写父类方法,fruit 对象默认调用子类中重写方法
注意 :
fruit 可以直接访问子类重写方法。
fruit 不能直接访问子类私有方法、子类所有属性。
fruit 可以通过重写方法调用子类私有方法和属性
fruit 重写方法中调用方法和属性顺序 : 子类 -> 父类
其他 : 关于重写的返回值类:如果方法的返回类型是 void
和基本数据类型,则返回值重写时不可修改。但是如果方法的返回值是引用类型,重写时是可以返回该引用类型的子类的。
2.向下转型
注意 : 只有向上转型过的对象才能向下转型
向下转型为恢复子类所有功能。
Apple apple = (Apple) fruit;
3.(多态)作用
减少编程代码
例 : 一个方法调用三种子类
public class Demo { public static void run(Fruit fruit){ fruit.show(); } public static void main(String[] args) { run(new Apple()); run(new Orange()); run(new Banana()); } } abstract class Fruit{ abstract void show(); } class Apple extends Fruit{ @Override public void show(){ System.out.println("apple"); } } class Orange extends Fruit{ @Override public void show(){ System.out.println("orange"); } } class Banana extends Fruit{ @Override public void show(){ System.out.println("banana"); } }
再进行向上转型
public class Demo { public static void run(Fruit fruit){ fruit.show(); if(fruit instanceof Apple){ Apple apple = (Apple) fruit; apple.eatApple(); }else if(fruit instanceof Orange){ Orange orange = (Orange) fruit; orange.eatOrange(); }else{ Banana banana = new Banana(); banana.eatBanana(); } } public static void main(String[] args) { run(new Apple()); run(new Orange()); run(new Banana()); } } abstract class Fruit{ abstract void show(); } class Apple extends Fruit{ @Override public void show(){ System.out.println("apple"); } public void eatApple(){ System.out.println("吃了一个apple"); } } class Orange extends Fruit{ @Override public void show(){ System.out.println("orange"); } public void eatOrange(){ System.out.println("吃了一个orange"); } } class Banana extends Fruit{ @Override public void show(){ System.out.println("banana"); } public void eatBanana(){ System.out.println("吃了一个banana"); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
相关文章
java通过Callable和Future来接收线程池的执行结果
这篇文章主要介绍了java通过Callable和Future来接收线程池的执行结果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2019-08-08浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka)
这篇文章主要介绍了浅谈Java消息队列总结篇(ActiveMQ、RabbitMQ、ZeroMQ、Kafka),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-05-05Jackson反序列化@JsonFormat 不生效的解决方案
这篇文章主要介绍了Jackson反序列化@JsonFormat 不生效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08
最新评论