怎么在java中对对象的类型进行转换

  介绍

怎么在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狗;都是真实的,这是它的“指针“决定的。但因为它的类型类是动物型、类型决定了能存储什么样的数据,对于已经存在的但不符合类型的数据都是不可见的,所以动物类型决定了它只能看到狗对象中动物的部分。

<>强如下图:

怎么在java中对对象的类型进行转换

既然可以向上转型,配合运算符的逻辑判断,就能实现很好的扩展性。例如,动物类的唱(动物)方法需要的是一个动物类,可以给它一只狗d,这时会向上转型(就像需要两类型却给了一个int数据一样),虽然转型了,但狗d的实际引用仍然是狗对象,于是如果(instanceof狗)判断为真,则调用能体现狗唱()方法特殊性的语句。如果传递一只猫,如果判断一下并调用能体现猫唱()方法特殊性的语句。这样,任何时候想添加一只动物,都只需要增加一条,如果语句就可以了。

怎么在java中对对象的类型进行转换