怎么在java中对对象的类型进行转换?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>对象类型转换强>
分为向上转型和向下转型(强制对象转型)。向上转型是子对象向父对象转型的过程,例如猫类转换为动物类;向下转型是强制转型实现的,是父对象强制转换为子对象。这和基础数据类型的转换是类似的,字节在需要时会自动转换为int(向上转型),int可以强制转型为字节(向下转型)。
对于对象转型来说,向上转型后子对象独有的成员将不可访问。意思是,在需要一只动物时,可以把猫当作一只动物传递,因为猫继承自动物,猫具有动物的所有属性。但向上转型后,猫不再是猫,而是被当作动物看待,它自己独有的属性和方法就不可见了。换句话说,向上转型后,只能识别父对象中的内容。
可以通过“引用变量instanceof类名“的方式来判断引用变量所指向的对象是否属于某个类,也就是说“对象是不是某类“,例如声明一个猫类对象的引用“猫c",然后“c instanceof Animal"表述的意思是“对象c是一种动物吗?“对于instanceof返回真正的对象,都可以转换为类对象,只不过有些可能需要强制转换。
向上转型可以自动进行,这本就是符合逻辑的,狗类继承自动物类,它本身就是一只动物,因此在需要动物类的时候,丢一只狗过去就会自动向上转型成动物类。但这时狗已经不是狗,而是动物,所以狗独有的成员不再可见。
强制转换的方式和基础数据类型强制转换一样,都是在待转换对象前加上目标类型,例如将动物一个强制转换为狗d:狗d=(狗)。
<强>下面是一个对象类型转换的示例,很好地分析了能否转型,转型后能否访问某些成员等等。强>
class Animal { ,String 名称; ,动物(String 名称){=this.name 名称;} } class Cat  extends Animal  { ,String eyecolor; ,猫(String 名称、String 颜色),{超级(名字);,this.eyecolor =,颜色;} } class Dog  extends Animal  { ,String furcolor; ,狗(String 名称、String 颜色),{超级(名字);,this.furcolor =,颜色;} } public class  OCast { ,public static  void 主要(String [], args), { ,Animal a =, new 动物(“animal"); ,Cat c =, new 猫(“cat",“blue"); ,Dog d =, new 狗(“dog",“black"); ,System.out.println (, a instanceof 动物);//return 真实的 ,System.out.println (, c instanceof 动物);//return 真实的 ,System.out.println (, d instanceof 动物);//return 真实的 ,System.out.println (, a instanceof 猫);//return 假 ,System.out.println (a.name);//return 动物=,,a  new 狗(“yellowdog",“yellow");,//object Dog upcast 用动物 ,System.out.println (a.name);,,//return yellowdog ,System.out.println (a instanceof 动物);//return 真正的 ,System.out.println (a instanceof 狗);//return 真正的 ,//System.out.println (a.furcolor);,//错误!,because a was regarded as 动物 ,Dog d1 =,(狗),,//,because “a instanceof Dog", is 的确,so force cast Animal a 用狗 ,System.out.println (d1.furcolor);,,//return 黄色 ,} }
对于上面的=new狗(“yellowdog"、黄色),一种是动物类型,但此时它指向的是狗对象。也就是说它是狗,所以也是动物类,所以instanceof动物);和instanceof狗;都是真实的,这是它的“指针“决定的。但因为它的类型类是动物型、类型决定了能存储什么样的数据,对于已经存在的但不符合类型的数据都是不可见的,所以动物类型决定了它只能看到狗对象中动物的部分。
<>强如下图:强>
既然可以向上转型,配合运算符的逻辑判断,就能实现很好的扩展性。例如,动物类的唱(动物)方法需要的是一个动物类,可以给它一只狗d,这时会向上转型(就像需要两类型却给了一个int数据一样),虽然转型了,但狗d的实际引用仍然是狗对象,于是如果(instanceof狗)判断为真,则调用能体现狗唱()方法特殊性的语句。如果传递一只猫,如果判断一下并调用能体现猫唱()方法特殊性的语句。这样,任何时候想添加一只动物,都只需要增加一条,如果语句就可以了。