Java向上转型及内存分析

发布时间:2019-11-17 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Java向上转型及内存分析脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

学习设计模式的时候,发现很多模式都用到了向上转型(eg. 工厂方法)。而我对向上转型(upcasting)的机制并不十分熟悉。这篇文章将深入分析向上转型的机制、内存分析。

概念

先从几个基本概念开始

1. Java中的引用类型(reference tyPE

Java中的数据类型分为两类:基本数据类型(int, double)和引用类型(String)。引用类型对象中保存着一个地址(称为“引用”),引用指向实际对象(称为“实例”),实际对象中保存着值。

关于Java数据类型在内存中的分析详解,请参考知友Intopass的解答:

Java 到底是值传递还是引用传递? - Intopass的回答 - 知乎
https://www.zhihu.com/questio...

2. 内存分配

Java向上转型及内存分析

Heap中的对象会继续指向内存中的数据段(data segment)。数据保存对象的实际值

3. 向上转型

定义:将父类的引用指向子类的实例 or 将子类对象赋值给父类引用

Dog dog = new Dog(); Animal anim = (Animal) dog; //实际对象类型没变,仅引用类型改变 anim.eat();

由于实际对象类型没变,所以,anim调用的eat方法仍是Dog类中重写的eat方法,而不是父类Animal类中的eat方法。

用途

我们为什么要使用向上转型?

Generally, upcasting is not necessary. However, we need upcasting when we want to wrITe general code that deals with only the supertype.

一般说来,向上转型不是必须的。但有时候,当我们的代码只需要与父类打交道时,可以使用向上转型,来使我们的代码不依赖具体子类,比如:

public class AnimalTrainer {     public void teach(Animal anim) {         anim.move();         anim.eat();     } }

以下代码,teach方法可以接受Animal类的任意子类:

Dog dog = new Dog(); Cat cat = new Cat();   AnimalTrainer trainer = new AnimalTrainer(); trainer.teach(dog); trainer.teach(cat);

内存分析

我们来分析以下转型代码在内存中的表示:

Dog dog = new Dog(); Animal anim = (Animal)dog;

Java向上转型及内存分析

脚本宝典总结

以上是脚本宝典为你收集整理的Java向上转型及内存分析全部内容,希望文章能够帮你解决Java向上转型及内存分析所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。