关于类变量,向上转换和向下转换之间有什么区别?
例如,在下面的程序类中,动物仅包含一个方法,而Dog类包含两个方法,然后将Dog变量强制转换为Animal变量。
如果转换完成,那么我们如何使用Animal变量调用Dog的另一个方法。
class Animal
{
public void callme()
{
System.out.println("In callme of Animal");
}
}
class Dog extends Animal
{
public void callme()
{
System.out.println("In callme of Dog");
}
public void callme2()
{
System.out.println("In callme2 of Dog");
}
}
public class UseAnimlas
{
public static void main (String [] args)
{
Dog d = new Dog();
Animal a = (Animal)d;
d.callme();
a.callme();
((Dog) a).callme2();
}
}
向下转换将转换为超类型,而向下转换将转换为子类型。始终允许进行向上转换,但是向下转换涉及类型检查,并且可能引发ClassCastException
。
在你的情况下,从a Dog
到a
的转换Animal
是不正确的,因为Dogis
-a Animal。通常,只要两个类之间存在is-a关系,就可以进行转换。
向下转换将是这样的:
Animal animal = new Dog();
Dog castedDog = (Dog) animal;
基本上,你正在做的就是告诉编译器你知道该对象的实际运行时类型是什么。编译器将允许进行转换,但仍将插入运行时完整性检查以确保转换有意义。在这种情况下,中投可能是因为在运行时animal实际上是Dog即使静态类型的animal
是Animal
。
但是,如果要执行此操作:
Animal animal = new Animal();
Dog notADog = (Dog) animal;
你会得到一个ClassCastException
。原因是因为animal
的运行时类型为Animal
,所以当你告诉运行时执行强制转换时,它会发现animal
实际上不是a Dog,因此抛出a ClassCastException
。
要调用超类的方法,你可以执行super.method()
或通过执行upcast
。
要调用子类的方法,你必须进行向下转换。如上所示,通常ClassCastException
这样做会冒a 的风险;但是,可以instanceof
在执行强制转换之前使用运算符检查对象的运行时类型,从而可以防止ClassCastExceptions
:
Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog) {
// Guaranteed to succeed, barring classloader shenanigans
Dog castedDog = (Dog) animal;
}
问题内容: C ++或Java中的类型转换和类型转换之间有什么区别? 问题答案: 类型 转换 将变量引用的值(内存块)视为与声明该变量的类型不同的类型。 类型 转换 实际上是在对该值进行转换。 在许多语言中, 某些 强制转换(通常是数字强制转换)的确会导致转换(这会因语言而异),但大多数情况下只是“将X当作Y处理”。 像人类语言的大多数方面一样,不幸的是,这些术语在不同社区中的使用略有不同,主要是
问题内容: 单向关联和双向关联有什么区别? 由于在数据库中生成的表都是相同的,所以我发现的唯一区别是双向关联的每一侧都有一个引用,而单向则没有。 这是单向关联 双向关联 区别在于该组是否持有用户的参考。 所以我想知道这是否是唯一的区别?哪个推荐? 问题答案: 主要区别在于,双向关系提供了双向导航访问,因此您无需显式查询即可访问另一侧。此外,它还允许您在两个方向上应用级联选项。 请注意,导航访问并不
本文向大家介绍类型转换(Type casting)和类型转换(Type conversion)之间的区别,包括了类型转换(Type casting)和类型转换(Type conversion)之间的区别的使用技巧和注意事项,需要的朋友参考一下 在本文中,我们将了解类型转换和类型转换之间的区别。 类型转换(Type casting) 开发人员使用强制转换运算符将数据类型转换为另一种数据类型。 它可以
问题内容: “隐式转换”和“显式转换”有什么区别?Java和C ++的区别是否不同? 问题答案: 显式转换是您使用某种语法 告诉 程序进行转换的地方。例如(在Java中): 隐式转换是在没有任何语法的情况下进行转换的地方。例如(在Java中): 应该注意的是(在Java中)涉及原始类型的转换通常涉及某种表示形式的更改,并且可能导致精度降低或信息丢失。相比之下,仅涉及引用类型的转换不会更改基本表示形
版本: Matlab 2009a 我正在生成一个大小向量 现在,Matlab将返回的元素向量[240,63,0]改为[-1,1],大小为 PS:我想从大小矩阵上的所有trhe值中减去或加上'1'
本文向大家介绍Java 向上转型和向下转型的详解,包括了Java 向上转型和向下转型的详解的使用技巧和注意事项,需要的朋友参考一下 Java 向上转型和向下转型的详解 转型是在继承的基础上而言的,继承是面向对象语言中,代码复用的一种机制,通过继承,子类可以复用父类的功能,如果父类不能满足当前子类的需求,则子类可以重写父类中的方法来加以扩展。 向上转型:子类引用的对象转换为父类类型称为向上转型。通