Java对象的转换

Java对象的转换

有一个对象Man , 一个引用Newton. 对象的类型的Man, 引用的类型也是Man.
		Man Newton = new Man();
一般情况下引用类型和对象类型是一样的.

类型转换就是引用类型和对象类型不一致时的问题

子类转父类(向上转型)

		Man Person = new Man();
		Superman one_touch = new Superman();
		Person = one_touch;
		//one_touch的引用指向的对象是超人
		//Person引用指向的是男人
		//把超人归属到男人, 能说通,所以可以转换Man Person = new Man();
		Superman one_touch = new Superman();
		Person = one_touch;
		
		//把one_touch这个引用所指向的对象(	Superman子类类型)转换成Person这个引用所对应的的父类类型(Man)

在什么时候需要转换, 将一个子类的引用赋给一个超类(父类)变量, 编译器是允许的. 但将一个超类的引用赋给一个子类变量, 必须进行类型转换, 这样才能够通过运行时的检查.

代码和思维似乎是相反的, 超人是男人, Person(男人引用)的引用指向为one_touch(超人引用)子类转父类, 可以这很English.我个人的理解是 父类 = 子类, 父类引用了子类, 这时子类就要转换, 所以是子类转父类, 子类在后,父类在前, 同时也是向上引用.父类的类型同时也发生改变.

这样记还是容易混淆, 把超人归属到男人这是说得通的. 把小米苹果归属到手机也是说得通的, 但是反过来手机就不一定是小米,还有可能是华为呢.

从面向对象的角度来看, 子类继承的父类的方法, 所以子类转换成父类是相匹配的(父类能用的方法子类也能用)

在how2j的例子中h已经是ADhero类型, h=ss应该是一个support转换成ADhero,应该是会报错的, 为什么能够转换成功? 而ad = (ADhero)h 转换却失败了.

		
		hero h = new hero();
		ADhero ad = new ADhero();
		support ss = new support();
		h = ad;
		System.out.println(h instanceof ADhero); //true
		System.out.println(ad instanceof ADhero);//true
		ad = (ADhero)h;
		System.out.println(h instanceof ADhero);//true
		System.out.println(ad instanceof ADhero);//true
		h = ss;
		System.out.println(h instanceof ADhero);//false
		ad = (ADhero)h; //报错

强制类型转换(向下转型)

将一个类型强制转换成另外一个类型的过程被称为类型转换. Java专门提供类型强制转换的表示法.
对象引用的转换语法与数值表达式的类型转换类似.
		double x = 1.23;
		int y = (int)x;
		Man Person = new Man();
		Superman one_touch = new Superman();
		one_touch = (Superman)Person;
		//不是所有男人都是超人, 所以要强制转换
		//强制转换能不能转换成功要看引用指向的对象到底是哪个.
不能转换的情况
		//农具和厨具都是物品goods的子类
		goods x = new goods();
		Farm_tools y = new Farm_tools();//农具
		Kitchenware z = new Kitchenware();//厨具
		x = y; //农具是物品, 能说通, x引用指向农具类
		z = (Kitchenware)x; //农具转换成厨具, 转换失败会抛出ClassCastException 类型转换异常

没有继承关系的类型进行相互转换一定会失败

实现类型转换成接口

引用employee指向的对象是Worker类型, 这个类型实现了work接口

		Worker employee = new Worker();
		work mission = employee;

把一个Worker类型转换为work接口
从语义上来讲,把一个Worker当做work来使用,而work接口只有一个working方法,这就意味着转换后就有可能要调用working方法,而Worker一定是有working方法的,所以转换是能成功的。

接口转换成实现类

	Worker employee1 = new Worker();
	work mission = employee1;
	Worker employee2 = (Worker) mission

employee1引用指向Worker, 而mission引用是接口类型:worl,实现类转换为接口,是向上转型,所以无需强制转换,并且一定能成功.
mission实际上是指向一个Worker的,所以能够转换成功.
与上面的类装换相同.没有继承关系的类型进行相互转换一定会失败.

instanceof

instanceof Worker判断一个引用所指向的对象,是否是Worker类, 或者Worler的子类.

		//农具和厨具都是物品goods的子类
		
		Farm_tools hoe = new Farm_tools();//农具
		Kitchenware knife = new Kitchenware();//厨具
		goods tool1 = hoe;
		goods tool2 = knife;
		System.out.println(tool1 instanceof Farm_tools);//true
		System.out.println(tool2 instanceof Kitchenware);//true
		//判断tool1是否属于goods的子类
		System.out.println(tool1 instanceof goods);//true

关于类型转换的一些问题:

例如:AA父类 BB子类
AA aa = new BB();
BB bb = (BB) aa;

A aa=new B();
B bb=(B) aa;
System.out.println(aa.toString());
System.out.println(bb.toString());
这是结果:
com.ejb.example.B@1e5e2c3
com.ejb.example.B@1e5e2c3
这说明aa和bb此时都变成B类了,换句话说,只要是你强转一个对象,这个对象的类型也就变了。

aa是BB类型。因为Java中,一个来对象的具体类型不是在源声明是做决定的,而是在初始化时做最终决定的,放到你的代码上来,AA aa这个过程中,如果没有aa = new BB();
这个步骤,那么aa的值始终是不固定的,只有在你显式的初始化时才会定下来。比如你这样写:
AA aa = new AA();
System.out.println(aa);
aa = new BB();
System.out.println(aa);
BB bb = (BB)aa;
System.out.println(bb);
你就能dao看出其中的差别了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值