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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王春祥 中级黑马   /  2012-3-20 19:58  /  2181 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Cat c=new Cat();
表示定义了一个Cat类的对象c
Animal c=new Cat();
表示定义了一个Animal类的引用指向Cat类的对象,这两个c有什么区别呢,引用是个什么概念呢

6 个回复

倒序浏览
引用是指向对象,即地址。java中允许父类的引用指向子类的对象。至于为什么我也不太清楚。
回复 使用道具 举报
很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的,也就是说 Cat is Animal这就是“向上转型”。

    那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特, 定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。 所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,父类引用是无法调用的;
那这么使用的优点是什么?
让你更关注父类能做什么,而不去关心子类是具体怎么做的,你可以随时替换一个子类,也就是随时替换一个具体实现,而不用修改其他.
也可以说是编译的时候表现出来的是父类的状态,执行的时候则表现出子类的状态。(这也是俗称的"多态")


评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
在运行时期,将根据c这个对象引用实际的类型来获取对应的方法。所以才有多态性。一个父类的对象引用,被赋予不同的子类对象引用,执行该方法时,将表现出不同的行为。在c=new Cat()的时候,仍然是存在两个句柄,但是c和new Cat()拥有同一块数据内存块和不同的函数表。自动实现向上转型。通过该语句,编译器自动将子类实例向上移动,成为通用类型Animal
回复 使用道具 举报
Cat c=new Cat();中的c是子类引用, Animal c=new Cat();中的c是父类引用
引用就相当于指针,通过它来查找对象
子类引用和父类引用的一点不同,看下面代码

class ParentClass {
        public int i = 10;
}
public class SubClass extends ParentClass {
        public int i = 30;
        public static void main(String[] args) {
                ParentClass parentClass = new SubClass();
                SubClass subClass = new SubClass();
                System.out.println(parentClass.i );
                System.out.println(subClass.i);
        }
}
运行结果:10
                30

这说明,如果父类和子类中有相同的成员变量名,ParentClass parentClass = new SubClass(); parentClass.i调用的父类的成员变量;
SubClass subClass = new SubClass();  subClass.i调用的是子类的成员变量

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 魏昂 于 2012-3-20 20:48 编辑

Cat c=new Cat();
表示定义了一个Cat类的对象c
Animal c=new Cat();
上面的是你写的一个程序 首先你要先明白 类是一个抽象概念 而对象是把类的概念实例化 例如 咱们可以打个比方 把 Cat看做是猫科动物,那么Animal就是动物了
Cat c=new Cat(); 这一行代码 的c是C生成的一个对象 可以把c看成是一只猫 ,猫科动物是一个抽象的概念 而猫是一个实物 我们大家都见过 猫自然也是猫科动物
通过猫我们可以了解猫科动物 这就是 类与类的实例化,也就是说 第一个c 实现的是Cat类的实例化 。那么 我们再来看第二个c ,Animal 是动物 自然 Animal c = new(Cat)
中的c 其实是生成Animal 的实例化 ,也就是说 这个c代表的是一只动物 而不是像第一个c那样 代表的是一只猫 ,说到这里不知道你明白了没有? 至于Animal c = new(Cat)这行代码 其实涉及的是一个子类与父类对象转换的问题 Cat代指猫科动物 Animal代指动物 ,猫科动物属于动物 所以 Animal 应该是Cat的父类 一只动物也是一只猫科动物这是可以的 自然而然的第二个c也就可以转换为Cat的类型的了。懂了没?

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
周建 黑马帝 2012-3-20 21:05:55
7#
Animal c=new Cat();正是多态的体现形式,父类的引用指向自己的子类对象,可以通过转型使父类使用子类的功能,父类的引用可以指向不同的子类对象,从而使用不同的功能,定义函数 public void methd(Animal c);传递不同的子类都可实现功能,提高扩展性;
引用就是将一个类类型的变量指向一个对象,实际上是将一个对象的地址值付给该变量,同一个地址值可以付给不同的变量(类型相同或具有继承关系),使这些变量指向同一个类;

点评

港行货  发表于 2012-3-21 00:05
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马