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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

class Student implements Comparable
{
private String name;。
private int age;   
Student(String name,int age)
{
  this.name = name;   
  this.age = age;     
}
public int compareTo(Object obj)
{
  //return 0;
  
  if(!(obj instanceof Student))
   throw new RuntimeException("不是学生对象");
  Student s = (Student)obj;
  System.out.println(this.name+"....compareto....."+s.name);
  if(this.age>s.age)
   return 1;
  if(this.age==s.age)
  {
   return this.name.compareTo(s.name);
  }
  return -1;
  
}
在学习集合的时候,多次遇到这个问题,
if(!(obj instanceof Student))
   throw new RuntimeException("不是学生对象");
  Student s = (Student)obj;
这一段程序是什么意思?

10 个回复

正序浏览
hmid 中级黑马 2014-8-8 01:15:11
9#

复制的代码格式怎么变了?
回复 使用道具 举报
hmid 中级黑马 2014-8-8 01:14:10
8#
  1. /* 判断obj是否属于Student对象(或Student子类对象) */
  2.                 if (!(obj instanceof Student))
  3.                         throw new RuntimeException("不是学生对象");
  4.                 /* 是。则可以强转为Student对象(包括obj是Student子类对象的情况)*/
  5.                 Student s = (Student) obj;
复制代码
回复 使用道具 举报
if(!(obj instanceof Student))        Object 类型是所有类的父类    但是这里的判断的 obj  所指向的 子类对象   是不是   指向Student类型   如果不是就执行   
   throw new RuntimeException("不是学生对象");
否则执行
  Student s = (Student)obj;

相当于   上面的只是简写了而已
if(!(obj instanceof Student))
{
   throw new RuntimeException("不是学生对象");
}
  Student s = (Student)obj
回复 使用道具 举报
健壮性判断和向下转型
回复 使用道具 举报
这是多态的知识点,简易再看看多态的视频,里面讲的很清楚了,可能看过了,没有真正理解
A 有三个子类 B C D
A  b= new  B();  A  c= new  C();
b是 B的对象,所以也是A的对象,这是向上转型
c是C的对象,所以也是A的对象,这是向上转型
B  b= new  B();这是向下转型, 发现不管向上还是向下转的都是子类对象,
也就是书上说的只有向上转型才能向下转型

注意:上面这句话是关键,这句话看着很简单,但是理解透不容易,下面是解释;

由上面的b,c对象可知:A的对象不一定就是B的对象,也可能是C的对象;
在你的问题中,这个if语句所在方法,public int compareTo(Object obj)接收的参数类型是Object.
Object是所有类的基类,那么所有类的对象也是它的对象。
但是:传进来的参数一定是Object类的对象,但是一定是Student对象?答案是:不一定
在这里,就要判断下这个参数到底是不是Student对象;
判断语句:obj instanceof Student

点评

向下转型的语句写错了,不好意思,B p= (B)b  发表于 2014-8-7 15:32
回复 使用道具 举报
if(!(obj instanceof Student)){
   throw new RuntimeException("不是学生对象");}
  Student s = (Student)obj;

因为传进来的要是学生才能比,所以比之前要进行判断传进来的是不是学生,不是学生的话就抛出运行时异常,
如果是学生的话就   Student s = (Student)obj;把obj强转为学生类对象
就接着往下走去比较

回复 使用道具 举报
个人理解,希望能帮到楼主!
instanceof 这个关键字是判断接收进来的obj对象是不是Person对象,如果不是则抛出Runtime异常,因为不是Person对象就不用比较了,如果是Person对象,则需要将obj对象强转为Person对象,因为你的obj其实是应用了多态,这时要转成Person需要向下转型,强转为Person对象

点评

感觉这个比较靠谱啊!  发表于 2014-8-8 07:07
回复 使用道具 举报
Student s = (Student)obj;是进行向下转型,因为你传进来的是Object类型的public int compareTo(Object obj),所以要把把Object类转化为Student类,要不然没办法比较
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马