黑马程序员技术交流社区
标题:
父类和子类的问题
[打印本页]
作者:
刘晓
时间:
2013-6-8 18:28
标题:
父类和子类的问题
本帖最后由 刘晓 于 2013-6-8 21:17 编辑
Animal a= new Cat( );
Cat c=(Cat) a;//强制将父类的引用转换为子类类型。
其中Cat是Animal的子类,我想问的是
a是不是Cat类的对象?
如果不是,那毕老师的视频里为何在没有强制转换父类引用的时候写
a.猫的方法
。
作者:
刘海芳
时间:
2013-6-8 18:50
本帖最后由 刘海芳 于 2013-6-8 18:51 编辑
无需强制,java的多态会使c向下转型为cat,即c就是cat的对象,可以用instanceof关键字来测试,
instanceof是用来判断某个对象是否属于某个类
public class Cat extends Animal{
public static void main(String[] args) {
Animal a=new Cat();
//instanceof是用来判断某个对象是否属于某个类
System.out.println(a instanceof Cat);
//output:true
}
}
复制代码
作者:
007诸葛亮
时间:
2013-6-8 18:50
创建对象时,a对象是 上转型对象,也就是说猫是动物成立,但说动物是猫不成立。当猫是动物上转型时,猫失去了自有的方法,但Animal方法是能调用的,这时候的a就是Animal ,当你运行时,会把a绑到Cat身上,叫运行时多态。希望对你的疑惑有帮助
作者:
张歆明
时间:
2013-6-8 19:07
a不是Cat类的对象 是Animal类型的引用变量
class Animal
{
public void eat(){
System.out.println("Animal is eating...");
}
}
class Cat extends Animal
{
public void eat(){
System.out.println("Cat is eating...");
}
}
class TestDuoTai
{
public static void main(String[] args){
Animal a =new Cat();
a.eat();
}
}
复制代码
打印结果
*************************
D:\BlackHorse_Pro\IO>java TestDuoTaiCat is eating...
*************************
毕老师从字面意义上进行了理解:
Animal a =new Cat();
赋值运算 先计算右边的 知道 这是个Cat类型的 左边声明的是Animal类型的 所以 a就是多态 两种身份 : (1)Animal类型的 (2). 也是Cat类型的
由于函数或者方法具有重写的特点(类似于生物中的变异) 只要子类中重写了父类中的方法 调用的时候,就会调用子类中重写的方法
所以这里面虽然是父类的引用 但是 指向的是Cat子类 Cat子类中又一次重写了eat()方法 所以 打印Cat is eating
***********************
内存图上理解
a是Animal类型的引用变量 指向的是堆内存中Cat类型的对象实例 尽管a是父类的引用 但是 a代表的是子类的对象 所以 由于 指向的子类的对象 并且方法被重写
a.eat()调用的就是a代表的Cat这个子类对象对应的重写的eat()的方法
作者:
王林涛
时间:
2013-6-8 20:59
先给说说这两句话什么意思:
Animal a= new Cat( ); // 类型提升,向上转型(Cat类型自动提升为了Animal型)
Cat c=(Cat) a; // 强制将父类引用转换成了子类类型,向下转型,这里的a是Animal类型,然后(Cat)a,转换为子类类型
所以就可以a.猫的方法
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2