有时候需要把父类对象指向子类对象,有时候需要把父类对象转换成子类对象。例如我们可以说某一只狗是一只动物,还可以说这只动物是一条狗,但前提是我们要知道狗肯定是动物,而那只动物必须是一只狗。下面介绍如何把父类指向子类对象,如何把子类对喜爱那个强制转换成子类对象。
1、父类引用指向子类对象
正常情况下,我们会定义某个类的对象引用,然后使用new实例化一个对象,然后把这个引用指向该实例。例如:
Dog dog = new Dog();
假设Dog是Animal的子类,也可以写下面的代码:
Animal animal = new Dog();
Animal animal定义了一个Animal对象引用,new Dog()实例化了一只狗,然后animal指向了这只狗。 这是允许的,就像我们指着一只狗,然后说它是动物,它确实是动物。
还可以写成下面的形式:
Animal animal = dog;
意思是把animal引用指向dog引用指向的实例。
这就是向上转型,不仅仅是父类可以指向子类的对象,只要是祖先类都可以指向子类的实例。典型情况,Object是所有类的祖先类,所以Object类型的对象引用可以指向任何对象。例如下面的代码:
Object o = new Dog();
把父类引用指向子类对象的好处是什么呢?自己可以思考一下,后面的多态性应用中详细介绍。
另外,类似的用法还有:
某个方法的定义如下:
public void setValue(Object o){
this.value = o;
}
这个方法的参数是Object类型,返回值类型是Object。因为参数类型是Object,所以在调用这个方法的时候我们可以给它传递任何类型的参数,包括上面的Dog对象,只要是它的子孙类就可以了。
再看下面的方法:
public Object getValue(){
return value;
}
value可以是任何类型,Dog实例,Animal实例,Date实例,Person实例都可以。
想想数据结构中的链表、队列等等,他们的元素可以是各种类型,就可以使用这种方式,可以设置整数链表、Dog链表,获取它的元素的时候,返回值的类型由元素类型决定,所以参数和返回值类型都应该设置为Object。
总结一句话:任何需要父类对象地方都可以给子类对象。
2、强制类型转换
我们可以把父类引用指向子类对象,但是这样带来的其他问题。假设Dog有一个特殊的行为方法f,如果把Dog实例赋值给了Animal引用,例如下面的代码:
Animal animal = new Dog();
如何访问Dog的f方法呢?
直接写animal.f()肯定不行,编译不能通过,因为animal没有方法f()。
所以这时候还需要把animal再转换成Dog才可以访问方法f。能这样写吗?
Dog d = animal;
不能,变异的时候就会报错类型不匹配。可以使用下面的代码:
Dog d = (Dog)animal;
强制把animal转换成了Dog,也就是把动物转换成了狗。这就是强制类型转换,把父类对象转换成子类对象(子类对象引用指向了父类对象)。
能转换吗?因为我们知道这只动物确实是狗,所以可以转换。
再看下面的代码:
Animal animal = new Cat();
Dog d = (Dog)animal;
单从第2行看,与之前的代码没有区别。但是大家一看就知道有问题,因为代码想把猫转换成狗,这时候会报错的:ClassCastException
这种错误不是语法错误,所以能够编译通过,但是在运行的时候出错。
所以在进行强类型转换的时候,我们要确保能够转换,只有当父类指向的实例是某个子类的对象的时候才可以转换成该类的对象。
如果不能确定可以通过instanceof操作符进行判断。
if(animal instanceof Dog)
Dog d = (Dog)animal;
分享到:
相关推荐
此java类实现了对数据表的分类递归树的实现,为本人倾力之作,后期,会发布js版,敬请期待!
这类数据在关系数据库中通常采用表结构存储,其中每个记录(结点)会包含自身的信息以及指向其父结点的引用。 - **多级编码的需求**: 在某些应用场景下,需要将这种基于父子关系表示的层级结构转换为多级编码形式。...
下面将详细讨论如何在Java中实现多层嵌套循环以及与之相关的参数转换和数据库配置。 首先,多层嵌套循环的基本概念是指在一个循环体内部嵌套另一个或多个循环,使得内层循环会根据外层循环的迭代次数多次执行。例如...
Java客户端实现Kafka生产者与消费者实例 kafka的副本机制及选举原理剖析 基于kafka实现应用日志实时上报统计分析 RabbitMQ 初步认识RabbitMQ及高可用集群部署 详解RabbitMQ消息分发机制及主题消息分发 ...
一、数据库父子结构数据设计 大部分采用 parentId的形式来存储父id,并且只存储父id,祖父Id不存储。也可以添加存储层级级别或者层级关系等字段。 CREATE TABLE `t_resource` ( `id` varchar(255) NOT NULL ...
* 层级结构:类加载器被组织成一种层级结构关系,也就是父子关系。 * 委派模式:类加载器的工作原理是基于委派模式。 * 可见性限制:下层的加载器能够看到上层加载器中的类,反之则不行。 * 不允许卸载类:类加载器...
6. **渲染**:Java 3D使用硬件加速来提高性能,将3D模型转化为2D图像的过程称为渲染。开发者可以通过设置渲染属性来优化性能和视觉效果。 7. **事件处理**:Java 3D支持用户输入事件,如鼠标点击和键盘操作,这使得...
4. **变量创建树型结构**:在Java中,树型结构可以表示为类或接口,比如`Node`类,包含一个数据字段和一个子节点列表。使用变量,我们可以实例化这些类,然后通过递归方法连接它们,形成层次结构。 5. **Java源码...
每个节点可以代表一个3D对象,如物体、光源或相机,而节点间的父子关系决定了显示的层次和空间关系。 2. **几何对象**:JAVA3D提供了多种几何形状,如立方体、球体、圆柱体等,开发人员可以通过组合这些基本形状...
Java 3D教程是针对那些想要在Java平台上创建三维图形应用程序的开发者们的重要资源。这个教程涵盖了从基础知识到高级概念的广泛内容,旨在帮助你掌握Java 3D API的使用...开始你的Java 3D之旅吧,探索无限的三维世界!
Hibernate通过实体类和映射文件能轻松地将这些关系转化为数据库表结构。 7. 性能优化:考虑到网络硬盘可能面临的大量文件操作,项目可能会采用分页、索引、缓存等手段来提升性能。例如,使用Spring的缓存抽象可以对...
在学习和研究这个压缩包时,首先应该查看文档以了解API的基本概念和使用方法,然后通过示例代码了解如何将理论转化为实践。对于有兴趣深入研究Java 3D的开发者来说,这是一份宝贵的资料,尽管今天的Java 3D可能已经...
总之,通过Java后端处理代码并转化为JSON,结合JavaScript在前端构建和展示树形结构,我们可以创建一个动态的、交互式的代码树视图。这种方法使得开发者能够直观地查看和理解代码的结构,提高了代码的可读性和管理...
Marshaller来实现Java对象与xml的互转的源代码,这是博文中用到的源码,地址:http://blog.csdn.net/y353027520dx/article/details/43446549 大家可以直接下载后运行,一起学习学习。。
2. **父子类间的转型**:转型只存在于具有继承关系的类之间。你可以将子类对象转换为父类对象(向上转型),这是自动完成的;也可以将父类对象转换为子类对象(向下转型),但需要使用强制转换操作符 `(子类类型)`。...
标题中的“java将list转为树形结构的方法(后台和前台)”指的是在Java编程语言中,如何将一个列表(List)数据结构转换为树形结构。这种转换通常用于处理层级关系的数据,如目录结构、组织架构等。转换分为前端...
**ClassLoader**,即类加载器,是Java虚拟机(JVM)中一个重要的组件,它的主要功能是将编译后的.class文件加载到内存中,并转化为Java可以理解的形式,进而使得程序能够运行起来。Java虚拟机规范定义了两类类加载器:...
总的来说,`TreeClass`是一个用Java实现的工具,旨在将一维数据转化为便于处理的树形结构。通过理解和使用这个类,开发者可以更好地组织和操作复杂的数据集,尤其是在需要层次分析或高效检索的情况下。不过,对于...
这个类可能还包含了处理父子关系的方法,例如添加、删除或查找子节点。 其次,`TreeData.java`可能是一个容器类,用于存储整个树结构的数据。它可能包含一个TreeNode对象的集合,并提供方法来加载、序列化和反序列...
在初始化时,程序会遍历文件系统,将每个目录和文件转化为对应的`DefaultMutableTreeNode`对象,并按照实际的父子关系组织起来。 然后,将构建好的树模型设置到`JTree`组件中,可以通过`JTree.setModel()`方法实现...