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

为什么当我尝试从父类创建一个子类(Downcasting)时,我得到一个空对象

当尝试从父类创建一个子类(Downcasting)时,得到一个空对象的原因可能是由于类型不匹配或者类型转换错误导致的。

在面向对象编程中,父类和子类之间存在继承关系。当我们尝试将一个父类对象转换为子类对象时,需要进行类型转换操作。这个过程被称为Downcasting。

下面是一些可能导致得到空对象的原因:

  1. 类型不匹配:父类对象的类型与子类对象的类型不匹配,无法进行类型转换。在这种情况下,尝试进行Downcasting会导致返回一个空对象。
  2. 父类对象不是子类的实例:父类对象可能并不是子类的实例,而是其他类的实例。在这种情况下,尝试进行Downcasting同样会导致返回一个空对象。
  3. 类型转换错误:在进行Downcasting时,可能存在类型转换错误的情况。例如,将一个不兼容的对象转换为子类对象,或者将一个已经被销毁的对象进行转换。这些错误会导致返回一个空对象。

为了解决这个问题,我们可以采取以下步骤:

  1. 确保父类对象是子类的实例:在进行Downcasting之前,需要确保父类对象是子类的实例。可以通过使用instanceof运算符来检查对象的类型。
  2. 检查类型匹配:在进行Downcasting之前,需要确保父类对象的类型与子类对象的类型匹配。如果类型不匹配,需要重新检查代码逻辑,确保正确的类型转换。
  3. 避免类型转换错误:在进行Downcasting时,需要确保类型转换是正确的。避免将不兼容的对象进行转换,以及将已经被销毁的对象进行转换。

总结起来,当尝试从父类创建一个子类(Downcasting)时,得到一个空对象可能是由于类型不匹配、父类对象不是子类的实例或者类型转换错误导致的。为了解决这个问题,需要确保父类对象是子类的实例,类型匹配,并避免类型转换错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java子类与父之间的对象转换(说明继承)

参考链接: 父子类在Java中具有相同的数据成员 在使用Java的多态机制,常常使用的一个特性便是子类和父之间的对象转换。...;从父类型向子类型的转换称为向下转换(downcasting),通过向下转换,我们能在必要的时候,将父类型变量转换成子类型变量,使用一些通过子类型才能够使用的方法。...以下是对于对象转换的一些个人理解,如有不对,欢迎指正,虚心向大神们请教。    首先是从子类向父的向上转换。...向上转换比较直观,总是能够将一个子类的实例转换为一个对象,从继承链的角度,这个特性很容易理解:继承是一种“是一种”的关系,从父派生出的子类,我们都能理解为,子类总是父一个实例。...一、父引用指向子类对象 1、若子类覆盖了某方法,则父引用调用子类重新定义的新方法 2、若子类未覆盖某方法,则父引用调用父本身的旧方法 3、若子类覆盖了某属性,但父引用仍调用父本身的旧属性

3.6K20

JavaSE篇学习之路:(六)【面向对象------中】

继承:指一个对象直接使用另一对象的属性和方法 继承的作用: 基本作用:子类继承父,代码可以得到复用。 主要(重要)作用:因为有了继承关系,才有了后期的方法覆盖和多态机制。...; } } class Cat extends Animal{ // 尝试子类当中对父的静态方法进行重写 public static void doSome(){ System.out.println...super() 只能出现在构造方法第一行,通过当前的构造方法去调用“父”中的构造方法,目的是:创建子类对象的时候,先初始化父类型特征。...super()表示通过子类对象调用父的构造方法 当一个无参构造方法第一行既没有this()也没有super()默认有一个super(). this()与super()不饿共存,且只在第一行.父构造方法一定执行...中定义了重名的变量 name 导致在当前对象中有两个 name,一个从父中继承过来的,一个是自己的,如果此时想访问父中继承过来的 name 则必须使用 super.name,当直接访问 name

25030

面向对象之封装和多态

运行时类型(运行时,具体是哪个子类就是哪个子类为什么会有这俩种类型呢 在发生多态,编译看编译类型,运行时看运行时类型。 ? 注:看代码里的注释,结合代码分析了多态。 ?...这样我们画一个形状就很灵活,只需要用父 Shape 的引用 . draw(),那么具体是画什么样的形状就由赋值给父引用的子类对象决定了。这样是不是就很灵活了呢? 由实际对应的对象类型决定。...多态的存在要有3个必要条件:要有继承,要有方法重写,父引用指向子类对象引用。 4. 小口诀:编译看左边,运行看右边。 对象的转型(casting) 为什么需要强制转换类型?...对应上面那个代码的例子: ((Circle) shape).area(); 一个的引用类型变量可以“指向”其子类对象一个的引用不可以访问其子类对象新增加的成员(属性和方法)。...子类对象可以当作基对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting

44610

InheritableThreadLocal原理简介使用 父子线程传递数据详解 多线程中篇(十八)

上一篇文章中对ThreadLocal进行了详尽的介绍,另外还有一个: InheritableThreadLocal 他是ThreadLocal的子类,那么这个又有什么作用呢? ?...,类型分别为:ThreadLocal和InheritableThreadLocal 然后在主线程中创建一个新的线程 在新的线程中,尝试获取他们的值 从打印信息可以看得出来 对于ThreadLocal获取的值为...小结: Thread对象,通过内部的     ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; 维护从父线程(创建该线程的线程)...对象的时候,借助于内部的init方法,调用createInheritedMap方法,从父线程(当前创建线程)中复制的一份 后续的数据读取解析,则是通过inheritableThreadLocals变量...,与内部的那个threadLocals没有什么关系 换个思路理解,他就是另外一个ThreadLocal,假定Thread定义了两个“ThreadLocal“,其中一个创建线程的时候会从父线程复制一份

76630

JAVA反射原理(nio java)

在java中,有两种RTTI的方式,一种是传统的,即假设在编译已经知道了所有的类型;还有一种,是利用反射机制,在运行时再尝试确定类型信息。...(超会自动实例化为子类,或使用instance of)。...传统的RTTI有3种实现方式: 向上转型或向下转型(upcasting and downcasting),在java中,向下转型(父转成子类)需要强制类型转换 Class对象(用了Class对象,不代表就是反射...,则尝试从ReflectionData对象中获取declaredMethods属性,如果是第一次,或则被GC回收之后,重新初始化后的类属性为,则需要重新到JVM中获取一次,并赋值给ReflectionData...方法中,会通过ReflectionFactory的newMethodAccessor创建一个实现了MethodAccessor接口的对象,实现如下: 在ReflectionFactory中,有2

65030

C++中的四种类型转换运算符

对于情况②,pd 指向的是整型变量 n,并没有指向一个 Derived 对象,在使用 dynamic_cast 进行类型转换也没有检查这一点,而是将 pd 的值直接赋给了 pb(这里并不需要调整偏移量...因为 pb 指向的不是一个对象,所以get_a()得不到 m_a 的值(实际上得到的是一个垃圾值),pb2->func()也得不到 func() 函数的正确地址。...同样都是向下转型,为什么 pa 指向的对象不同,转换的结果就大相径庭呢?...”起来,从而形成一个继承链(Inheritance Chain),也就是如下图所示的样子:当使用 dynamic_cast 对指针进行类型转换,程序会先找到该指针指向的对象,再根据对象找到当前(指针指向的对象所属的...造成这种假象的根本原因在于,派生对象可以用任何一个的指针指向它,这样做始终是安全的。

22320

在 Vue 中使用 TypeScript 的一些思考(实践)

Vue.extend or vue-class-component 使用 TypeScript 写 Vue 组件,有两种推荐形式: Vue.extend():使用基础 Vue 构造器,创建一个子类”...两种形式输出结果一致,同是创建一个 Vue 子类,但在书写组件选项如 props,mixin ,有些不同。...而做为 TypeScript 特殊的存在(它既可以作为类型,也可以作为值),当我们使用 vue-class-component 并通过 $refs 绑定为子类组件,便能获取子组件上暴露的类型信息:...,当我们导入一个并不存在的 .vue 文件,也能通过编译: ?...当我尝试在 .vue 文件中导入已存在或者不存在的 .vue 文件,却得到不同的结果: 文件不存在: ? 文件存在: ? 文件不存在,引用 Vue 的声明文件。

3.2K30

走进面向“对象”编程的理想国(一)——深入理解Python中的一切皆对象

网上关于Java和C++的面向对象编程相关介绍的博客文章已经很多了,那我为什么还写呢?因为,人生苦短,刚好是学Python的......刚好今天当我在学习Python的OOP,刚想吐槽这面向对象编程内容还挺多,突然就有一句乱入了——美女“编程”老太婆。???,这好不容易有个美女编程,怎么变成了老太婆。...我们用一个简单的例子来模拟一下 接着,我们先了解一下面向对象的三个核心概念: 继承。通俗理解,“儿子从父亲那继承下来的东西”。...如果在一个的基础上创建新的有,会将父的属性和方法直接继承下来,从而减少重复代码的编写。提供继承信息(财产)的我们称为父、或者基、超得到继承信息的我们称为子类、或派生或衍生。 多态。...通过多态,子类可以扩展父的能力,或者覆写父的操作。 封装。对封装的理解,就像一个具有某些功能的黑箱子,隐藏一切可以隐藏的实现细节,然后对外提供简单的编程接口。

41131

全面理解Java中继承关系

,那么就看最顶层的的功能  super  super 是 Java提供的一个关键字super用于限定该对象调用它从父继承得到的实例变量或方法。...在构造器中使用super,则super会用于限定于该构造器初始化的是该对象从父继承得到的实例变量,而不是该类自己定义的实例变量。意思就是调用父的构造器。...当创建一个子类对象,不仅会为该类的实例变量分配内存,也会为它从父继承得到的所有实例变量分配内存,即使子类定义了与父中同名的实例变量。 即依然会为父中定义的、被隐藏的变量分配内存。...,其中的main方法入栈执行,main方法中创建子类对象子类对象创建过程中,父子类都加载到内存中,并且Fu.class优先于Zi.class加载,父中的静态域先执行后,再执行子类中的静态域,此时会第一个输出...当创建Sub对象,先执行其父构造器,如果父构造器调用了被子类重写覆盖的方法,就会调用被子类重写后的②号test()方法,子类的test方法调用了子类的实例变量name,父直接调用的子类的test

1.3K00

EasyC++78,动态联编

作者 | 梁唐 大家好,是梁唐。 这是EasyC++系列的第78篇,聊聊动态联编。 静态联编和动态联编 当我们使用程序调用函数的时候,究竟应该执行哪一个代码块呢?...因为使用哪一个函数不能在编译确定了,因为编译器不知道用户将选择哪个类型的对象。所以,编译器必须能在程序运行的时候选择正确的虚函数,这被称为动态联编。...因为派生继承了基当中所有的数据成员和成员函数,因此基成员能够进行的操作都适用于子类成员,所以向上强制转换是可传递的。 如果反过来呢?将父对象传递给子类指针呢?...这种操作被称为向下强制转换(downcasting),在不使用强制转换的前提下是不允许的。因为is-a关系通常是不可逆的,派生当中往往新增了一些数据成员或方法,不能保证在父对象上一样还能兼容。...同样Hero子类当中也会有这样一个指针指向一个虚函数的列表,由于我们在Hero子类当中没有重载show_name方法,所以Hero类型的对象中的列表中的第一个元素仍然是1024。

23310

挑战30天学完Python:Day21 对象

Python中的所有东西都是一个对象,包括它的属性和方法。程序中使用的数字、字符串、列表、字典、元组、集合等都是相应内置对象。我们创建创建对象,类似于对象构造函数,或者创建对象的“蓝图”。...我们实例化一个创建一个对象定义对象的属性和行为,而另一方面,对象表示。 从接受这个系列挑战开始,我们就在不知不觉中使用对象。Python程序中的每个元素都是对象。...['HTML', 'CSS', 'JavaScript'] 继承 继承允许我们定义一个从父继承所有方法和属性的。...父或基是提供所有方法和属性的子类是继承自另一个或父。 让我们通过继承 person 创建一个 student 。...我们可以给子类添加一个新方法,也可以通过在子类创建相同的方法名来覆盖父方法。比如当我们添加 init() 函数子类将不再继承父的 init() 函数。

15920

挑战30天学完Python:Day21 对象

Python中的所有东西都是一个对象,包括它的属性和方法。程序中使用的数字、字符串、列表、字典、元组、集合等都是相应内置对象。我们创建创建对象,类似于对象构造函数,或者创建对象的“蓝图”。...我们实例化一个创建一个对象定义对象的属性和行为,而另一方面,对象表示。 从接受这个系列挑战开始,我们就在不知不觉中使用对象。Python程序中的每个元素都是对象。...['HTML', 'CSS', 'JavaScript'] 继承 继承允许我们定义一个从父继承所有方法和属性的。...父或基是提供所有方法和属性的子类是继承自另一个或父。 让我们通过继承 person 创建一个 student 。...我们可以给子类添加一个新方法,也可以通过在子类创建相同的方法名来覆盖父方法。比如当我们添加 init() 函数子类将不再继承父的 init() 函数。

14420

JavaSE(五)JAVA对象向上转型和向下转型

通俗地说就是是将子类对象转为父对象。此处父对象可以是接口   1.2、解释     比如说有两个一个是父Animal,另一个是Bird子类。     ...向上转型,父指向子类引用对象会遗失除与父对象共有的其他方法,也就是在转型过程中,子类的新有的方法都会遗失掉,在编译,系统会提供找不到方法的错误。   ...二、对象的向下转型   1.1、定义     父引用的对象转换为子类类型成为向下转型   1.2、解释     Son s = (Son)f1;     这就是downcasting,向下转型。   ...如Father father = new Son(); 3、把指向子类对象的父引用赋给子类引用叫向下转型(downcasting),要强制转型。   ...如father就是一个指向子类对象的父引用,把father赋给子类引用son 即Son son =(Son)father;    其中father前面的(Son)必须添加,进行强制转换。

1K60

第五章:面向对象编程

// 运行时会出现异常:指针异常。NullPointerException。这是一个非常著名的异常。 // 为什么会出现指针异常?...(通常把这个构造方法叫做缺省构造器) 构造方法中给属性赋值了,为什么还需要单独定义set方法给属性赋值呢? 在构造方法中赋值是对象第一次创建属性赋的值。...当从父中继承过来的方法,无法满足子类的业务需求。 当满足什么条件的时候 ,构成方法重写? 条件1:方法覆盖发生在具有继承关系的父子类之间。...向上转型和向下转型 多态的向上转型 : 编译看左边 ,运行看右边 其中在多态的向上转型中使用对象去调用方法只能调用子类从父那里继承的方法或者重写的方法 ,而不能调用子类自己特有的方法。...比如: // 在这个程序中 ,所创建对象可以去调用从父那里继承下来的方法,而不能调用scratch()方法。

9911

为什么使用抽象?有什么好处?

最简单的说法也是最重要的理由:接口和实现分离 老是在想为什么要引用抽象,一般不就够用了吗。一般里定义的方法,子类也可以覆盖,没必要定义成抽象的啊。 看了下面的文章,明白了一点。...小王:“你要让帮你拿那个水杯吗?” 你要的是水杯对象。而东西是水杯的父。通常东西没有实例对象,但我们有时需要东西的引用指向它的子类实例。...抽象的特点是,不能创建实例。 这些该死的抽象,也不知道它有什么屁用。非要把它改一改不可。把抽象中的抽象方法都改为实现。也就是给抽象方法加上一个方法体,不过这个方法体是的。...但是,当我调用当前方块的翻转方法,它的子类都有吗?如果你把翻转方法写到方块中,它的子类自然也就有了。可以这六种子类的翻转方法是不同的。我们知道'田'方块,它只有一种状态,无论你怎么翻转它。...当我看到方块是抽象的,我会很关心它的抽象方法。知道它的子类一定会重写它,而且,我会去找到抽象的引用。它一定会有多态性的体现。

1.6K90

浅谈 Java 反射技术

程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。...当我们在使用 IDE(如 Eclipse,IDEA)当我们输入一个对象并想调用它的属性或方法,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射。...3.2、获取的构造器信息 获取构造器的用法,主要是通过Class的getConstructor方法得到Constructor一个实例,而Constructor一个newInstance方法可以创建一个对象实例...使用Class对象的newInstance()方法来创建Class对象对应的实例。 Class<?...四、总结 由于反射会额外消耗一定的系统资源,因此如果不需要动态地创建一个对象,那么就不需要用反射。

30620

Java核心-面向对象(中)

二、继承1、概念继承(Inheritance),是指子类继承父的特征和行为,使得子类对象(实例)具有父的实例域和方法,或子类从父继承方法,使得子类具有父相同的行为。...2.1 概念1)向上转型(upcasting):把一个子类类型安全地变为父类型(子转父,正常转)2)向下转型(downcasting):把一个类型强制转型为子类类型(父转子,要强转)2.2 instanceof...3)在测试中分别创建 Student对象和 Undergraduate对象,调用它们的 show()方法。...2)有父引用指向子类对象:Parent p=new Child(); (子转父,向上转型,正常转)3)有方法的重写。1.4 多态的好处及缺点1)好处为什么要使用"继承"和"多态性"?...因为它对于代码的可重用性很有用(在创建可以重用现有的属性和方法)。a、使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利。b、消除类型之间的耦合关系。

21012

Java之多态

简化性 多态存在的三个必要条件 继承 重写 父引用指向子类对象 比如:Parent p = new Child(); 对象的转型 为什么需要强制转换类型?...一个的引用类型变量可以“指向”其子类对象一个的引用不可以访问其子类对象新增加的成员(属性和方法)。...子类对象可以当作基对象来使用称作向上转型(upcasting),反之称为向下转型(downcasting) 当使用多态方式调用方法,首先检查父中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法...虚方法 我们将介绍在Java中,当设计,被重写的方法的行为怎样影响多态性。 我们已经讨论了方法的重写,也就是子类能够重写父的方法。...当子类对象调用重写的方法,调用的是子类的方法,而不是父中被重写的方法。 要想调用父中被重写的方法,则必须使用关键字super。 如图看看下个代码演示: 父 ? 子类 ? 测试 ?

58510

Python编程思想(27):的继承

子类的角度来看,子类扩展( extend)了父,但从父的角度来看,父派生(derive)出子类。也就是说,扩展和派生所描述的是同一个动作,只是观察角度不同而已。...一个。...在子类中将可以继承得到定义的方法,这样子类就可复用父的方法了。 2....当一个子类有多个直接父,该子类会继承得到所有父的方法,这一点在前面代码中已经演示了。现在的问题是,如果多个父中包含了同名的方法,此时会发生什么呢?...上面程序中Item和 Product两个父中都包含了info()方法,当 Mouse1子类对象调用info方法子类中没有定义info方法,因此 Python会从父中寻找info方法,此时优先使用第

1.3K10

Java里的构造函数(构造方法)

主要用来在创建对象初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。...一, 构造函数的特点: 构造函数的主要作用是完成对象的初始化工作,(如果写的里面没有构造函数,那么编译器会默认加上一个无参数且方法体为的构造函数).它能够把定义对象的参数传给对象的域。...意即当创建一个对象,这个对象就被初始化.如果这时构造函数不为,则会在创建对象就执行构造函数里面的代码:                                        构造函数的名称必须与名相同...但是,子类只能继承父的默认构造函数,如果父没有默认的构造函数,那子类不能从父继承默认构造函数.这时子类必须使用super来实现对父的非默认构造函数的调用....在创建对象,先调用父默认构造函数对对象进行初始化,然后调用子类自身自己定义的构造函数。

2.4K00
领券