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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢洋 高级黑马   /  2013-3-5 00:20  /  2068 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 谢洋 于 2013-3-5 21:30 编辑

在类与类之间的继承中,当我们用父类的引用指向子类对象时,这个引用也就指向子类对象中的父类对象
但我们都知道,接口是不能产生对象的,也就是说其子类对象中不存接口的对象,然而当我们用接口的引引指向子类的对象时,那么这个引用实际最终是指向哪里?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

7 个回复

正序浏览
谢洋 发表于 2013-3-5 13:17
当子类父中都有同名非私有变量时,且把子类对象赋给父类引用时,
这时,如果我们用父类引用.非私同名变量 ...

当出现同名非私有变量时  你可以理解是 当多态建立子类对象时   堆内存两个变量都有  一个父类的一个子类的,由于引用类型是父类的  所以找的时候就找父类的变量了   如果不能理解就记住:多态中成员变量的特点是无论编译还是运行,都参考左边(其引用型变量所属的类)    不过这里面没有父类对象的事,多态中自始至终都是子类对象在做变化
回复 使用道具 举报
他是指向子类对象的,,

同学你可以这样理解:
接口:可以认为是一个特殊的抽象类
        当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。也就是说接口里面的函数都是抽象的

你把接口看成是个特殊的抽象类就行了,,只不过他里面的方法都是抽象方法,他是抽象类的话那么他的引用就是指向子类对象了
回复 使用道具 举报
一、在类与类之间的继承中,当我们用父类的引用指向子类对象时,这个引用也就指向子类对象中的父类对象
在Java程序创建某个类的对象时系统会隐身创建该类父类的对象。只要有一个子类对象存在,则一定存在一个与之对应的父类对象。比如有一个父类叫Fruit,子类名叫Apple。
如果创建一个Apple对象,这必须先创建一个Object对象,然后在创建一个Fruit对象,最后在创建Apple对象,这是Java中的继承树的执行顺序。


1.当子类父中都有同名非私有变量时,且把子类对象赋给父类引用时,这时,如果我们用父类引用.非私同名变量;打印的果是父类的变量值,那这又怎么解释?

因为子类其实是一种特殊的父类,因为Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型是由系统自动完成的。
Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和
运行时类型不一致,就会出现所谓的多态。
  1. public class People {

  2.         public String name="people";
  3.         public String getName() {
  4.                 return name;
  5.         }
  6.         public void setName(String name) {
  7.                 this.name = name;
  8.         }
  9. }
  10. public class BlackPeople extends People{
  11.         private String name="blackPeople";
  12.         public String getName() {
  13.                 return  name;
  14.         }
  15.         public void setName(String name) {
  16.                 this.name = name;
  17.         }
  18.         public static void main(String[] args) {
  19.                 People people=new BlackPeople();//编译时的类型是People,运行时的类型是BlackPeople;
  20.                 System.out.println(people.name);
  21.         }
  22. }
复制代码
通过引用变量来访问其包含的实列属性时,系统总是试图访问它编译时类所定义的属性。而不是它运行时类型所定义的属性。


2.我们只new了一个子类对象,却可以打印出父类变量的值,如果没有父类对象,那你说这个变量值是怎么存在??
在Java程序创建某个类的对象时系统会隐身创建该类父类的对象。只要有一个子类对象存在,则一定存在一个与之对应的父类对象。


二、但我们都知道,接口是不能产生对象的,也就是说其子类对象中不存接口的对象,然而当我们用接口的引引指向子类的对象时,那么这个引用实际最终是指向哪里?
和上面通用的道理。

评分

参与人数 1技术分 +1 收起 理由
洪建超 + 1

查看全部评分

回复 使用道具 举报
门文通 发表于 2013-3-5 03:07
你第一句不对吧   父类引用指向子类对象  就是子类对象  什么事子类对象中的父类对象?
接口型引用一样  同 ...

当子类父中都有同名非私有变量时,且把子类对象赋给父类引用时,
这时,如果我们用父类引用.非私同名变量;
打印的果是父类的变量值,那这又怎么解释?
我们只new了一个子类对象,却可以打印出父类变量的值,如果没有父类对象,那你说这个变量值是怎么存在??
回复 使用道具 举报
我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们更倾向于使用抽象概念“人”。实际上就是所谓的向上转型,通俗地说就是子类转型成父类。这也符合Java提倡的面向抽象编程思想

评分

参与人数 1黑马币 +12 收起 理由
黄玉昆 + 12 赞一个!

查看全部评分

回复 使用道具 举报
你第一句不对吧   父类引用指向子类对象  就是子类对象  什么事子类对象中的父类对象?
接口型引用一样  同样指向子类对象
回复 使用道具 举报
List list=new ArrayList();
变量list存于栈中,存放的是一个地址值,这个地址是new ArrayList();操作返回的。
所以父类的引用指向的就是堆中的子类对象。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马