A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 山水游客 中级黑马   /  2012-6-18 20:15  /  1348 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙胜录 于 2012-6-18 23:04 编辑

什么是对象转型以及如何判断对象的类型

5 个回复

正序浏览
可使用引用变量instanceof+类名来判断该引用类型变量所“指向”的对象是否属于该类或该类的子类。
父类引用=子类对象  这种转型叫做上转型 是自动进行的,也就是将子类型转为父类。
子类引用=(子类名)父类对象  这种转型叫做下转型 通常也称为强制转换。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 逝去的记忆ヽ 于 2012-6-18 20:39 编辑

对象转型分为两种:一个是向上转型,一个是向下转型。

现在有动物、鸟类、燕子三个名词,他们之间有什么关系呢?通常我们都会说,燕子是特殊的鸟类,或者说燕子是鸟类的一种。为此,从对象的定义来看,鸟类就是一个父类,而燕子就是一个子类。或者说,燕子对象就是一个鸟类对象。由于燕子是鸟类的一个对象,所以鸟类所具有的特性燕子全部具有。而燕子所具有的特性(如迁徙)则鸟类不一定都具有。在这个例子中,燕子也是一种鸟类。为此可以将燕子的对象堪称是一个鸟类的对象。这种方法在Java语言环境中就叫做“向上转型”。

但是,在实际工作中,我们还经常会遇到向下转型的情况。也就是说从一个抽象类中(鸟类)引用具体类(燕子)中的对象。也就是说,我们可以说燕子是鸟类的一种。但是现在反过来,如果说鸟类就是燕子,那显然就是以偏概全了,因为燕子并不具有其他鸟类的特性。如鸽子的特性燕子就没有。所以,在应用程序开发中,如果将父类对象赋值给子类的对象,就可能有问题。如果硬要这么做的话,则很有可能发生编译器错误。因为父类对象并不一定是子类的实例。这是什么意思呢?即所说的鸟类(父类对象)并不一定是子类对象(燕子)。因为鸟类对象还有可能是鸽子、白鹭等等。所以,如果将父类对象给子类对象的话,那么就会出现问题。

关于如何判断对象类型可以用 instanceOf来判断
给你一个代码例子:
public int compareTo(Object obj)
{
if (!(obj instanceof Student))//这里就是判断接收的Object类对象是不是Student对象,如果不是那就抛出异常。
   throw new RuntimeException("不是学生对象。");
  
  Student s = (Student)obj;//进行强制转换 将接受的OBJ转化成student类
  System.out.println(this.age+"--------"+s.age);
  if (this.age>s.age)
   return 1;
  if(this.age == s.age)
  {
   return this.name.compareTo(s.name);//在比较字符串时,String类也继承了comparable这个接口。
  }
  return -1;

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 呵呵,加油啊!

查看全部评分

回复 使用道具 举报
可用instanceof判断对象类型
回复 使用道具 举报
楼上回答非常好{:soso_e100:}
回复 使用道具 举报
父类  引用名 = new 子类();//向上转型,类型提升

//如果想调用子类的特有方法时,需向下转型,强制将父类的引用转成子类类型:
子类  引用名 = (子类)父类引用;

//注意:千万不要将父类的对象转换成子类类型,我们能转的是父类的引用指向了自己的子类对象时,该引用可以被提升,也可以强制转换。
//多态自始至终都是子类对象在做着变化。

多态用instanceof判断类型时,不要将判断父类型放在前面。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马