多态和类型转换

感觉很抽象,很纠结,一直心存疑问,把子类的对象赋值给父类的对象,子类很多东西都损失了啊,因为父类里边可能没有那些属性方法啊,

 

然后我把书上的东西改了改,做了小测试,人家例题程序使用隐式转换将Circle对象赋值给Object对象object1,后边有instanceof,用来说明本质没变,它还是Circle类,利用object3做参照,打印toString(),发现:尽管都赋值给了Object对象,但在Object对象的外衣下,object1和object2还是Circle和Rectangle类的对象,很诡异的,还是那句话,作为一个Object对象,我不知道原来子类的一些特征(譬如方法和变量)保存到哪去了。。

还是说它既是父类的实例,又是子类的实例,纠结。。。

往前翻了一页,好像明白点了,既然叫多态,就是那个意思,它(也就是Object的对象)具有多个状态,既可以是子类的实例又可以是父类的实例,先匹配子类,再一步一步向上搜寻匹配呗,动态绑定(dynamic binding),也就是多态性(polymorphism).

 

 

附带定义:子类的实例转换为父类的变量总是可行的,叫向上转换(upcasting),因为子类的实例永远是父类的实例;相反是donwcasting。

downcasting必须使用转换记号(子类名)进行显示转换。  例:Circle circle1=(Circle)object1;

重点是,书上很多话很纠结,名词乱用(感觉),比如,转换时确保该对象是另一个对象的实例,而书上是

myObject instanceof Circle,,我觉得这意思是该对象是另一个类的实例。

我学的不好?对象和类是两个概念吧。

就是这些用词不准确,让我很纠结,学编程应该咬文嚼字吗?应该吧。

package chapter09;

public class TestPolymorphismCasting {
 public static void main(String[] args){
  //我这种定义太麻烦了,先初始化,还得用Circle等类实例化
 //  Object object1=new Object();
 //  Object object2=new Object();

 //书上的定义方法,一步到位,有隐式转换

  Object object1=new Circle(1);
  Object object2=new Rectangle(1,1);
  Object object3=new Object();
  displayObject(object1);
  displayObject(object2);
  displayObject(object3);
  System.out.println(object1.toString());
  System.out.println(object2.toString());
  System.out.println(object3.toString());
  
 }
 public static void displayObject(Object o){
  if(o instanceof Circle){
   System.out.println("The circle area is "+((Circle)o).getArea());
   System.out.println("The circle diameter is "+((Circle)o).getDiameter());
  }
  if(o instanceof Rectangle){
   System.out.println("The rectangle area is "+((Rectangle)o).getArea());
  }
 }
}

ps:对象成员访问运算符(.)优于类型转换运算符,所以要((circle)object).getArea();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值