2 h2498864708 h2498864708 于 2016.01.14 16:16 提问

关于多态,求助好心人

就是cat extends animal;animal a=new cat();new cat()这个对象的名字只是用animal a称呼了吧?
那为什么不可以a调用猫自己的特有方法呢

8个回答

sinat_31535993
sinat_31535993   Rxr 2016.01.14 16:25

谁告诉你a是猫了?a没有指明他到底是哪种动物,只有指明a=new Cat();a才表示猫,才有猫的特有方法

github_33742874
github_33742874 回答的很确切,哈哈
接近 2 年之前 回复
CSDNXIAOC
CSDNXIAOC   2016.01.14 16:18

多态——在我写这篇文章之前,我一直认为多态指的是“运行时多态”,就是在基类中借助virtual关键字实现的。
好,看到这里,忘记上面那句话。

  1. 多态是如何实现绑定的 多态的绑定可以分为运行时多态和编译时多态。 编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数决定实现何种操作。(有些人写的是根据参数列表和返回值,但返回值在C++中式可以忽略的,因为其......
    答案就在这里:关于C++中的多态
    ----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。
github_33742874
github_33742874   2016.01.14 16:25

abstract class Animal{
abstract void say();
}
class Cat{
public void eat(){

    System,out,println("喵.....");

}

}
Animal a = new Cat( );
创建的这个对象到底是那个类的对象,麻烦给我分析下,刚才复习的时候有些乱,这个是向上引用,指向的是父类,现在调用 a.say(); 调用的是Cat类里面的方法,是向上引用的对吧!
new关键字接的是什么,就是创建的哪个对象。
另外子类对象的实例可以用父类对象变量甚至接口变量来引用
现实中常见的写法
Map map = new HashMap();
List list = new ArrayList();
其中Map 与 List都是接口,HashMap与ArrayList都是实现接口的实现类,Java中允许这样定义。

q4444tita
q4444tita 你这个代码…cat都木有继承动物类…没有多态……animal a =new cat()根本就是错的……编译都过不去……多态分编译时多态和运行时多态…编译时多态…就是你写的那句代码会根据声明编译……运行时多态……声明a的实际对象……他调用方法时…先找自己的……自己没有再找父类……
接近 2 年之前 回复
github_33742874
github_33742874   2016.01.14 16:24

abstract class Animal{
abstract void say();
}
class Cat{
public void eat(){

    System,out,println("喵.....");

}

}
Animal a = new Cat( );
创建的这个对象到底是那个类的对象,麻烦给我分析下,刚才复习的时候有些乱,这个是向上引用,指向的是父类,现在调用 a.say(); 调用的是Cat类里面的方法,是向上引用的对吧!
new关键字接的是什么,就是创建的哪个对象。
另外子类对象的实例可以用父类对象变量甚至接口变量来引用
现实中常见的写法
Map map = new HashMap();
List list = new ArrayList();
其中Map 与 List都是接口,HashMap与ArrayList都是实现接口的实现类,Java中允许这样定义。

zhengyutou
zhengyutou   2016.01.14 16:40

Animal a = new Cat(); ,new Cat()这个动作先创建父对象Animal,再跳到Cat的构造函数创建子对象Cat。然后“=”将Cat的引用赋给Animal 的引用a,a才能够调用Cat对象中的方法。java的东西基本都封装了,想更深挖的话建议看看C++的多态机制。

u013638600
u013638600   2016.01.14 16:51
        声明是什么类它就是什么类,声明是animal类它就只有animal类的功能
        就像是告诉它,你是动物类,所以它虽然本来是猫,它却不知道自己是猫,当你想让它知道自己是猫,你就强制转换回来:(cat)a;这时它才明白过来自己是猫,就可以用猫的功能了:(cat)a.猫叫();
qq_33159419
qq_33159419   2016.01.14 17:49

我的理解是new cat()是cat的实例他是可以调用cat本身的方法的,但是animal a=new cat()用animal接收了,也就是现在这个cat已不是cat而是animal,
而animal是cat的父类是不可以调用其子类特有的方法的

qq_33159419
qq_33159419   2016.01.14 17:49

我的理解是new cat()是cat的实例他是可以调用cat本身的方法的,但是animal a=new cat()用animal接收了,也就是现在这个cat已不是cat而是animal,
而animal是cat的父类是不可以调用其子类特有的方法的

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!