资讯专栏INFORMATION COLUMN

Java向上转型及内存分析

Zachary / 2644人阅读

摘要:但有时候,当我们的代码只需要与父类打交道时,可以使用向上转型,来使我们的代码不依赖具体子类,比如以下代码,方法可以接受类的任意子类内存分析我们来分析以下转型代码在内存中的表示

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

概念

先从几个基本概念开始:

1. Java中的引用类型(reference type)

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

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

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

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;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68635.html

相关文章

  • 多态

    摘要:父类型引用指向子类型对象多态以下程序编译是没有问题的,因为编译器检查到的数据类型是和之间存在继承关系,并且是父类型,是子类型,父类型转换成子类型叫做向下转型,语法合格。 package duotai;public class Animal { public void move() { System.out.pr...

    Magicer 评论0 收藏0
  • Java笔记 - 重写/重载,向上转型/向下转型

    摘要:所以静态方法不能被覆盖。虽然就算你重写静态方法,编译器也不会报错。也就是说,如果你试图重写静态方法,不会阻止你这么做,但你却得不到预期的结果重写仅对非静态方法有用。我们应该直接使用类名来访问静态方法,而不要使用对象引用来访问。 重写/重载 重写指的是根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。所以静态方法不能被覆盖。 (如果从重写方法会有什么特点来看,我们是不能...

    qqlcbb 评论0 收藏0
  • Java编程思想》笔记7.复用类

    摘要:在类的构造方法中。对基类构造器的调用必须放到子类构造器的第一行。约定用大写字母下划线命名规范空白空白指被声明为但又未给定初值的域,但可以在构造方法必须在域的定义处代码块或构造器中对进行赋值。 点击进入我的博客 复用代码是Java众多引人注目的功能之一,但要成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。 7.1 组合 组合语法 就是在当前类中产...

    ningwang 评论0 收藏0
  • 面向对象接口多态

    摘要:多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。具体格式如下父类引用指向子类对象就是多态的定义格式。多态的转型分为向上转型与向下转型两种向上转型当有子类对象赋值给一个父类引用时,便是向上转型,多态本身就是向上转型的过程。 第3天 面向对象 今日内容介绍 接口 多态 笔记本案例今日学习目标 写出定义接口的格式 写出实现接口的格式...

    wangdai 评论0 收藏0
  • Java 复用类(7)

    摘要:复用代码是众多引入注目的功能之一。但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。 复用代码是Java众多引入注目的功能之一。但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须能够做更多的事情。 1.组合语法 将对象引用置于新类中. 初始化对象引用:1.定义时初始化;2.构造器初始化;3.使用之前(惰性初始化);...

    darkbaby123 评论0 收藏0

发表评论

0条评论

Zachary

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<