日期:2014-05-20  浏览次数:20738 次

询问专业培训学校的老师都没能解释清楚的问题,估计也是困扰很多新手的一个问题,有没有人能够解答一下呢
例子:一个person类。
Obejcet obj = new Person();
if(obj instanceof Person){
  per= (Person)obj;
}

不解之处请各位java高端写手解答一下:第一行这样写就表示obj是Person类的一个实例了,但第二行为什么要判断一下obj是不是Person类的实例,不是没必要吗,既然是Person的实例了就可以直接进行第三行向下转型的操作了啊。

------解决方案--------------------
因为Object类是Person类的父类,所以
Object obj=new Person()实际上表达的是创建一个Person类的实例,由其父类的变量obj引用此实例
由于其父类的变量obj除了能引用Person类的实例外,还能引用任何Object的子类的实例,所以第二句判断下引用的是不是确实就是Person类的实例,如果是,就可以强制类型转换了。

这个例子应该是为了演示继承与多态。
当然你如果知道obj实际就是是在引用一个Person类的实例,大可以直接类型转换.

以上是个人见解,如有不对请指教。
------解决方案--------------------
一楼正解,person是object的子类,而object有很多子类,从person到object转型可以直接转,因为person是Object的子类啊,举个例子吧 ,人是动物的一个子类,你可以说人是动物,就像person到object,但你能说动物是人吗?就像object到person,肯定不行啊,所以要判断,但是如果你明确知道你所指的那个动物确实是人的话,也可以说动物是人,就像一楼说的如果知道obj实际就是是在引用一个Person类的实例,大可以直接类型转换.希望对楼主有帮助


------解决方案--------------------
还有楼主说 这是 询问专业培训学校的老师都没能解释清楚的问题,我在想是他们不想告诉你呢,还是真不知道,如果连多态和继承都不知道的话,他们怎么给你培训的呢???