首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java将一个对象转换为他的超类,然后再将它转换回它自己,这样就保持了引用

Java中将一个对象转换为其超类,然后再将其转换回自身的过程称为向上转型和向下转型。

向上转型是指将一个子类对象赋值给父类引用变量的过程,这样可以实现多态性。通过向上转型,可以将一个具体的子类对象视为其父类类型,从而可以调用父类中定义的方法和属性。这种转型的优势在于可以提高代码的灵活性和可扩展性。

向下转型是指将一个父类对象转换为其子类对象的过程。在向上转型后,如果需要调用子类特有的方法或属性,就需要进行向下转型。但是需要注意的是,向下转型需要满足转换的对象实际上是子类对象的条件,否则会抛出ClassCastException异常。

这种对象的转换在实际开发中常用于以下场景:

  1. 多态性的应用:通过向上转型,可以将不同子类对象统一处理,提高代码的可读性和可维护性。
  2. 继承关系的处理:在父类和子类之间进行对象的转换,方便在不同层次的类之间传递数据和调用方法。
  3. 接口的应用:接口可以作为父类类型,通过向上转型,可以将实现了接口的子类对象赋值给接口引用变量,实现接口的多态性。

腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):提供弹性计算能力,满足各类业务需求。详情请参考:https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版(CDB):提供高性能、可扩展的关系型数据库服务。详情请参考:https://cloud.tencent.com/product/cdb
  • 人工智能平台(AI Lab):提供丰富的人工智能算法和模型,支持开发者快速构建智能应用。详情请参考:https://cloud.tencent.com/product/ai
  • 云存储(COS):提供安全、稳定、低成本的对象存储服务,适用于各类数据存储需求。详情请参考:https://cloud.tencent.com/product/cos
  • 区块链服务(Tencent Blockchain):提供高性能、可扩展的区块链解决方案,支持企业级应用场景。详情请参考:https://cloud.tencent.com/product/tbc
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

java 序列化Serializable

一般情况下,我们在定义实体时会继承Serializable接口,类似这样: ? 我们在实体引用了Serializable这个接口,那么这个接口到底有什么?...一个对象序列化接口,一个只有实现Serializable接口,它对象才能被序列化。 什么是序列化? 序列化是将对象状态转换为保持或传输格式过程。...把对象换为字节序列过程称为对象序列化把字节序列恢复为对象过程称为对象反序列化什么情况下需要序列化?...一个接口里面什么内容都没有,我们可以将它理解成一个标识接口。...比如在课堂上有位学生遇到一个问题,于是举手向老师请教,这时老师帮解答,那么这位学生举手其实就是一个标识,自己解决不了问题请教老师帮忙解决。

57460

看了这篇泛型,下次设计链表别傻傻用int 表示node节点值了

各种程序设计语言和其编译器、运行环境对泛型支持均不一样。类型参数化以达到代码复用提高软件开发工作效率一种数据类型。泛型引用类型,是堆对象,主要是引入了类型参数这个概念。...向上转型:子类对象赋值给父类型变量,这种技术称为向上转型。可以在父中定义方法,然后根据子类中具体实现这样也正是多态机制基本思想。 ?...谈完向上转型,当然还有个向下转型啦,向下转型就是较抽象换为较具体。当然向下转型需要强制类型转换(显示转换告诉编译器) ?...中Object为所有()。...而同理我们借鉴这种思想可以一个先向上转型成Object然后再将操作完数向下转型成我们所需要数。达到这种使用上效果,但是基本类型无法满足这个要求啊,所以就出现包装这个东西。

48020
  • C++四种转换(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

    static_cast 相当于C语言中强制转换:(类型)表达式或类型(表达式),用于各种隐式转换 非constconst、void*指针、int和char相互转换 用于基和子类之间指针和引用转换...只能用于含有虚函数,必须用在多态体系种,用于层次间向上和向下转化。只能指针或引用。向下转化时,如果是非法对于指针返回NULL,对于引用抛异常。...如果没有virtual方法进行下行转换(指针或引用)会直接报错 const_cast 常量指针被转化成非常量指针,并且仍然指向原来对象; 常量引用被转换成非常量引用,并且仍然指向原来对象; const_cast...比如int指针,可能会出问题,尽量少用;随意转换编译都会通过,但是不安全转换运行时会异常 错误使用reinterpret_cast很容易导致程序不安全,只有转换后类型值转换回到其原始类型...reinterpret_cast不能转换掉表达式const 可以用在void*转换为int类型 unsigned short Hash( void *p ) { unsigned int val

    3.5K10

    带着问题高效学Android:关于Java与Kotlin泛型你应该知道知识点

    Java语言中泛型则不一样,它只在程序源码中存在,在编译后字节码文件中,已经替换为原来原生类型(Raw Type,也称为裸类型),并且在相应地方插入了强制转型代码,因此,对于运行期Java...一段Java代码编译成Class文件,然后再用字节码反编译工具进行反编译后,将会发现泛型都不见了,程序又变回了Java泛型出现之前写法,泛型类型都变回了原生类型 public static String...因为类型擦除问题,所以所有的泛型类型变量最后都会被替换为原始类型。这样引起了一个问题,既然都被替换为原始类型,那么为什么我们在获取时候,不需要进行强制类型转换呢?...然后第25,它做了一个checkcast操作,即检查类型#19, 在在上面找#19引用类型,是 9: new #19 // class java/util/Date 是一个Date类型,即做Date...所以不是在get方法里强,是在你调用地方强 kotlin泛型 kotlin泛型中引入了in和out Out (协变) 如果你泛型作为内部方法返回,那么可以用 out: interface

    1.1K00

    狗屎一样代码!快,重构我!

    在变量未被使用情况下猜测当初其设置目的,会让你发疯。 15、过度耦合消息链 如果你看到用户向一个对象请求另一个对象然后再向后者请求另一个对象然后再请求另个一对象……..这就是消息链。...这个表达式提炼到一个独立函数中。这个临时变量所有引用点替换为对新函数调用。此后,新函数就可被其他函数使用。...如果一个承担太多责任而变得臃肿不堪,这种情况下会使用提炼一部分责任分离出去。如果一个变得太不负责任,使用内联化将它融入到另一个中。...3、对象改为引用对象 你从一个衍生出许多彼此相等实例,希望将它们替换为一个对象这个值对象变成引用对象。 4、引用对象改为值对象 你有一个引用对象,很小且不可改变,而且不易管理。...操作放进独立函数(保持签名相同),然后将它们移至。 11、以委托取代继承 某个子类只使用接口中一部分或根本不需要继承而来数据。

    77930

    狗屎一样代码!快,重构我!

    这个表达式提炼到一个独立函数中。这个临时变量所有引用点替换为对新函数调用。此后,新函数就可被其他函数使用。...如果一个承担太多责任而变得臃肿不堪,这种情况下会使用提炼一部分责任分离出去。如果一个变得太不负责任,使用内联化将它融入到另一个中。...3、对象改为引用对象 你从一个衍生出许多彼此相等实例,希望将它们替换为一个对象这个值对象变成引用对象。 4、引用对象改为值对象 你有一个引用对象,很小且不可改变,而且不易管理。...7、保持对象完整 从某个对象中取出若干值,将它们作为某一次函数调用时参数。改为传递整个对象。...操作放进独立函数(保持签名相同),然后将它们移至。 11、以委托取代继承 某个子类只使用接口中一部分或根本不需要继承而来数据。

    1.1K40

    看完本文知道

    需要注意是null在这里我们算在原始类型里面,但是你用typeof时候会发现是object,原因是就算一个对象,那应该在栈中存一个引用地址,但是一个对象,所以这个地址为空,也就是不对应堆中任意一个数据...要想让他们相等,得直接b赋值为a,这样他们引用地址一样,就是相等。 ? 类型转换 JS中当不同类型数据进行计算时候会进行类型转换,比如下面的例子: ?...转数值 转为数值就很简单,经常在用,就是这两个全局方法:parseInt和parseFloat。 对象字符串 对象换为字符串和数值会稍微麻烦点,下面我们单独来探究下。...对象转数值 对象类型转为数值主要有两种方法: +value Number(value) 这两种执行逻辑是一样: 先调用valueOf方法,如果值是原始值,返回 否则,调用toString方法,然后...一个对象如果是一个实例的话,那原型上constructor其实也就指向这个,我们可以通过判断constructor来判断是不是某个实例。具体原理在前面提到文章也有详细说明。

    52741

    Java变量与数据类型

    常见关键字可以分为如下几类,具体关键字如下图所示: 访问控制 、方法及变量修饰符 程序控制 错误处理 包相关 基本类型 变量引用 保留字 数据类型 基本数据类型 Java 中,共有 8...Java 编译器中,对于字符串和其他数据类型之间,可以使用 + 进行连接,编译器会自动将其他数据类型自动转换为字符串,然后再进行连接; String 既然是不可变,那有什么优点呢?...对象已经被创建过,那么就会优先从字符串常量池中获取其引用,其不可变性确保不同引用指向同一 String 对象; 安全性 我们经常用 String 作为我们方法参数,其不变性能够保证参数不可变; 线程安全...中已经存在指向 “xxx” 对象,所以直接在堆中创建一个字符串对象; 数据类型转换 对于基本数据类型,不同类型之间是可以相互转换,但是需要满足一定条件; 从小到大自动,从大到小强制。...成员变量又可以分为 全局变量(又叫实例变量) 和 静态变量(也叫变量),两者区别如下: 名称 修饰符 访问方式 生命周期 全局变量 无 对象名.变量名 一旦对象引用,则实例变量存在 静态变量

    52730

    【C++】一文掌握C++四种类型转换 --- static_cast、reinterpret_cast、const_cast、dynamic_cast

    C++通过了一个十分直接方法,想什么类型operator重载什么类型: class A { public: //explicit A(int a1) 这样不支持隐式类型转换!...3.4 dynamic_cast 动态转换 dynamic_cast用于一个对象指针/引用换为子类对象指针或引用(动态转换) 向上转换:子类对象指针/引用->父指针/引用(不需要转换,赋值兼容规则...) 向下转换:父对象指针/引用->子类指针/引用(用dynamic_cast转型是安全) 学习过继承之后,我们知道派生内部是包含一个,可以通过切片方式来转换成基!...甚至不需要产生临时对象!这是天然支持!但是对于基换为子类就有点复杂!...void func(A* pa) { B* pb = (B*)pa; } 对于这样一个函数,基指针会强制类型转换为子类指针,当pa指针本来就是指向一个B对象,在转换回去,没有问题。

    16610

    Java 从入坑到放弃】No 3. 变量与数据类型

    常见关键字可以分为如下几类,具体关键字如下图所示: 访问控制 、方法及变量修饰符 程序控制 错误处理 包相关 基本类型 变量引用 保留字 数据类型 基本数据类型 Java 中,共有 8 中基本数据类型...Java 编译器中,对于字符串和其他数据类型之间,可以使用 + 进行连接,编译器会自动将其他数据类型自动转换为字符串,然后再进行连接; String 既然是不可变,那有什么优点呢?...对象已经被创建过,那么就会优先从字符串常量池中获取其引用,其不可变性确保不同引用指向同一 String 对象; 安全性 我们经常用 String 作为我们方法参数,其不变性能够保证参数不可变; 线程安全...中已经存在指向 “xxx” 对象,所以直接在堆中创建一个字符串对象; 数据类型转换 对于基本数据类型,不同类型之间是可以相互转换,但是需要满足一定条件; 从小到大自动,从大到小强制。...成员变量又可以分为 全局变量(又叫实例变量) 和 静态变量(也叫变量),两者区别如下: 名称 修饰符 访问方式 生命周期 全局变量 无 对象名.变量名 一旦对象引用,则实例变量存在 静态变量

    1.1K20

    Swift入门:

    您可以一个定义为基于另一个,添加任何您想要新内容。 当你创建一个实例时,它被称为一个对象。如果复制该对象,默认情况下,两个副本都指向同一个数据——更改一个,副本也会更改。...初始化对象 如果我们要将Person结构体转换为Person,Swift不会让我们这样写: class Person { var clothes: String var shoes:...} } 注意它初始值设定项是如何接受三个参数,然后调用super.init()name和age传递给Singer——但只有在设置它自己属性之后。...在处理对象时,你会看到super经常被使用,它意思是“在我继承上调用一个方法”。它通常被用来表示“让我先做它需要做所有事情,然后再做额外事情。”...对于对象每个副本都指向同一个原始对象,因此如果更改一个,它们都会更改。Swift调用结构体“值类型”,因为它们只指向一个值,而引用类型”,因为对象只是对实际值共享引用

    73510

    这代码写太烂了!你以为我真想写“垃圾代码”吗?

    在变量未被使用情况下猜测当初其设置目的,会让你发疯。 15、过度耦合消息链 如果你看到用户向一个对象请求另一个对象然后再向后者请求另一个对象然后再请求另个一对象……..这就是消息链。...这个表达式提炼到一个独立函数中。这个临时变量所有引用点替换为对新函数调用。此后,新函数就可被其他函数使用。...如果一个承担太多责任而变得臃肿不堪,这种情况下会使用提炼一部分责任分离出去。如果一个变得太不负责任,使用内联化将它融入到另一个中。...3、对象改为引用对象 你从一个衍生出许多彼此相等实例,希望将它们替换为一个对象这个值对象变成引用对象。 4、引用对象改为值对象 你有一个引用对象,很小且不可改变,而且不易管理。...将它们合为一体。 10、塑造模板函数 子类中某些函数以相同顺序执行类似操作,但各操作细节略有不同。操作放进独立函数(保持签名相同),然后将它们移至

    95930

    狗屎一样代码!快,重构我!

    在变量未被使用情况下猜测当初其设置目的,会让你发疯。 15、过度耦合消息链 如果你看到用户向一个对象请求另一个对象然后再向后者请求另一个对象然后再请求另个一对象……..这就是消息链。...这个表达式提炼到一个独立函数中。这个临时变量所有引用点替换为对新函数调用。此后,新函数就可被其他函数使用。...如果一个承担太多责任而变得臃肿不堪,这种情况下会使用提炼一部分责任分离出去。如果一个变得太不负责任,使用内联化将它融入到另一个中。...3、对象改为引用对象 你从一个衍生出许多彼此相等实例,希望将它们替换为一个对象这个值对象变成引用对象。 4、引用对象改为值对象 你有一个引用对象,很小且不可改变,而且不易管理。...操作放进独立函数(保持签名相同),然后将它们移至。 11、以委托取代继承 某个子类只使用接口中一部分或根本不需要继承而来数据。

    74130

    告别垃圾代码,请收下这几个锦囊妙计!

    在变量未被使用情况下猜测当初其设置目的,会让你发疯。 15、过度耦合消息链 如果你看到用户向一个对象请求另一个对象然后再向后者请求另一个对象然后再请求另个一对象……..这就是消息链。...这个表达式提炼到一个独立函数中。这个临时变量所有引用点替换为对新函数调用。此后,新函数就可被其他函数使用。...如果一个承担太多责任而变得臃肿不堪,这种情况下会使用提炼一部分责任分离出去。如果一个变得太不负责任,使用内联化将它融入到另一个中。...3、对象改为引用对象 你从一个衍生出许多彼此相等实例,希望将它们替换为一个对象这个值对象变成引用对象。 4、引用对象改为值对象 你有一个引用对象,很小且不可改变,而且不易管理。...将它们合为一体。 10、塑造模板函数 子类中某些函数以相同顺序执行类似操作,但各操作细节略有不同。操作放进独立函数(保持签名相同),然后将它们移至

    45410

    告别垃圾代码,请收下这几个锦囊妙计!

    在变量未被使用情况下猜测当初其设置目的,会让你发疯。 15、过度耦合消息链 如果你看到用户向一个对象请求另一个对象然后再向后者请求另一个对象然后再请求另个一对象……..这就是消息链。...这个表达式提炼到一个独立函数中。这个临时变量所有引用点替换为对新函数调用。此后,新函数就可被其他函数使用。...如果一个承担太多责任而变得臃肿不堪,这种情况下会使用提炼一部分责任分离出去。如果一个变得太不负责任,使用内联化将它融入到另一个中。...3、对象改为引用对象 你从一个衍生出许多彼此相等实例,希望将它们替换为一个对象这个值对象变成引用对象。 4、引用对象改为值对象 你有一个引用对象,很小且不可改变,而且不易管理。...将它们合为一体。 10、塑造模板函数 子类中某些函数以相同顺序执行类似操作,但各操作细节略有不同。操作放进独立函数(保持签名相同),然后将它们移至

    53530

    何时应该重构代码?如何重构代码?

    在变量未被使用情况下猜测当初其设置目的,会让你发疯。 15.过度耦合消息链 如果你看到用户向一个对象请求另一个对象然后再向后者请求另一个对象然后再请求另个一对象........这就是消息链。...这个表达式提炼到一个独立函数中。这个临时变量所有引用点替换为对新函数调用。此后,新函数就可被其他函数使用。...如果一个承担太多责任而变得臃肿不堪,这种情况下会使用提炼一部分责任分离出去。如果一个变得太不负责任,使用内联化将它融入到另一个中。...3.对象改为引用对象 你从一个衍生出许多彼此相等实例,希望将它们替换为一个对象这个值对象变成引用对象。 4.引用对象改为值对象 你有一个引用对象,很小且不可改变,而且不易管理。...将它们合为一体。 10.塑造模板函数 子类中某些函数以相同顺序执行类似操作,但各操作细节略有不同。操作放进独立函数(保持签名相同),然后将它们移至

    1.7K30

    json与,集合转换(一)之gson实现

    json与,集合转换(一)之gson实现 1.序列化 反序列化 主要用于存储对象状态为另一种通用格式,比如存储为二进制、xml、json等等,把对象转换成这种格式就叫序列化,而反序列化通常是从这种格式转换回来...使用序列化主要是因为跨平台和对象存储需求,因为网络上只允许字符串或者二进制格式,而文件需要使用二进制流格式,如果想把一个内存中对象存储下来就必须使用序列化转换为xml(字符串)、json(字符串)或二进制...(流) json与对象之间转换实现主要是以下几种方式:gson faston Jackson json-lib 2.准备工作 定义实体: public class User { private...artifactId>gson 2.2.4 4.下面是gson实现方式: 说白两个方法...add(guestUser); group.getUsers().add(rootUser); Gson gson = new Gson(); //用户组对象

    24630

    No 3. 变量与数据类型

    搭建 Java 开发环境 No 2. 玩转 IDEA 在之前文章中,我们已经介绍了如何搭建 Java 开发环境以及如何使用 IDEA,现在开始正式学习 Java 语言相关语法吧!?...所谓变量,就是用来命名一个数据标识符,在 Java 中,变量又可以分为两种: 基本类型变量 引用类型变量 // 基本类型变量 int id = 1; // 引用类型变量 String name...Java 编译器中,对于字符串和其他数据类型之间,可以使用 + 进行连接,编译器会自动将其他数据类型自动转换为字符串,然后再进行连接; String 既然是不可变,那有什么优点呢?...对象已经被创建过,那么就会优先从字符串常量池中获取其引用,其不可变性确保不同引用指向同一 String 对象; 安全性 我们经常用 String 作为我们方法参数,其不变性能够保证参数不可变; 线程安全...成员变量又可以分为 全局变量(又叫实例变量) 和 静态变量(也叫变量),两者区别如下: 名称 修饰符 访问方式 生命周期 全局变量 无 对象名.变量名 一旦对象引用,则实例变量存在 静态变量

    2.2K20

    深入理解 Java 基本数据类型

    引用类型:它以特殊方式(类似 C 指针)向对象实体(具体值),这类变量声明时不会分配内存,只是存储一个内存地址。 从使用方面来说 基本类型:使用时需要赋具体值,判断时使用 == 号。...基本数据类型与包装转换被称为装箱和拆箱。 装箱(boxing)是值类型转换为引用类型。例如:int Integer 装箱过程是通过调用包装 valueOf 方法实现。...拆箱(unboxing)是引用类型转换为值类型。例如:Integer int 拆箱过程是通过调用包装 xxxValue 方法实现。(xxx 代表对应基本数据类型)。...原因在于: i1、i2 都是包装,使用 == 时,Java 将它们当做两个对象,而非两个 int 值来比较,所以两个对象自然是不相等。正确比较操作应该使用 equals 方法。...例如:int Integer 装箱过程是通过调用包装 valueOf 方法实现。 拆箱(unboxing)是引用类型转换为值类型。

    1.1K20

    Groovy 运算符 条件运算符,对象运算符学习

    (PS:需要Groovy3+以上版本才能使用),运算符::: 而我们从javaGroovy中很容易造成无法理解代码地方,就在于Groovy中新增各种对象运算符。...name // 我们这样写之后,就不会出异常。...为了与Java8 在方法引用保持一致,在Groovy3.0 之后我们可以使用new获取指定构造函数方法指针。示例代码如下: def foo = BigInteger....&toUpperCase //创建一个String toUpperCase 字母大小写方法引用对象。 def tst = instanceMethod('zinyan') //调用该引用。...那么需要补充一些关于stream相关知识。其中map步骤在流中是属于映射操作。也就是流里面的对象映射成另外一个类型。 相关知识不太懂可以百度搜索:java stream相关知识 。

    1.9K10
    领券