首页 > 代码库 > java入门之——对象转型
java入门之——对象转型
对象的类型转换是我们在编程的时候经常会遇到的,java平台也是如此,比如一些基本类型的数据转型和复合数据的转换。
举例
java语言中主要分为向上转型和向下转型,如何来了解和掌握这两者转型的关系呢?首先我们先来举个例子,相信大家看完以后就会明白了。
比如说我们的现实的世界中有动物、猫科动物、老虎这三样东西,它们三者都有什么样的关系呢?如果用面向对象的思维来考虑的话,老虎是子类,猫科动物是老虎的父类。老虎对象就是猫科动物的对象,在这里要特别说明的一点就是:老虎是猫科动物的一个对象,那么猫科动物所具有的特征老虎都有,(用面向对象来说就是有相同的属性和行为),这种方法就是向上转型(通常也叫隐式转型)。
如果是这样转型的话是没有问题的,我们人的正常思维也是正确的,编译器在编译的时候也不会报错的。但是在工作中我们经常会遇到向下转型的情况,但是这种向下转型时候编译器往往会报错,如果说猫科动物是老虎的话,这里应该是一个否命题(至少目前为止),在面向对象的世界里面,越是具体的东西它所具有的特征就越多,而越抽象的东西他的特性就越少,只是抽象了一些共性的东西。要确保对象向下转型的时候即编译器不会报错,又要确保具体的对象在抽象对象中也有,在这里,我们需要采用java的关键字来判断一下,instanceof,我们可以利用这个操作符来判断一个类是否实现了一个接口或者是一个类的子类。
老虎 instanceof 猫科动物,它返回的是一个布尔值。如果返回true的话说明该对象是某个类的实例,false是反之。
代码
看一下下边的程序段:
package test; class A { public String f(A obj) { return("A"); } } class B extends A { public String f(B obj) { return("C"); } public String f(A obj) { return("D"); } }
我们使用子类创建一个对象:
B b = new B();
然后再将这个子类的引用放到父类对象中:
A a;
a = b;
那么这个父类对象a是子类对象b的上转型对象,对象的实体由子类负责建立,实质还是子类,只是损失了一些功能而已,这样的得失具体如下:
得:上转型对象可以操作和使用子类继承或者重写的方法。
失:上转型对象丧失了对子类新增成员变量或新增的方法的操作和使用。
那么下边的这段测试代码的打印结果就是“D”,因为a2只能有public String f(A obj) 这个方法是可以用的。public class TestObj { public static void main(String args[]) { A a1 = new A(); A a2 = new B(); //子类对象转化为父类,称为上转型,不需要强制转换。 B b = new B(); System.out.println(a2.f(b)); //“D” System.out.println(); if (a2 instanceof B) { B b1 = (B) a2; //父类对象转化为下转型,此时需要使用强制转换,此时需要先判断要转换的这个对象(也就是a2指向的这个对象)是不是B类的实例 System.out.println(b1.f(b));//"C" System.out.println(b1.f(a1));//"D" } } }
总结
对象转型可以使父类对象的引用可以指向子类对象,给程序带来了比较好的可扩展性:我们可以在一个方法的参数里面定义父类的引用,然后实际当中传的时候传的是子类的对象,然后我们再在方法里面判断这个传过来的子类对象到底属于哪个子类,然后再去执行这个子类里面的方法或者调用这个子类里面的成员变量,因此程序的可扩展性比单独定义好多个方法要好一些。不过这个可扩展性还没有达到最好,使用多态就可以让程序的扩展性达到极致。
java入门之——对象转型
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。