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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈世涛 中级黑马   /  2012-7-16 19:39  /  2129 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

undergraduatestudent s1=new undergraduatestudent();
graduate s2=new graduate();
Student x;
x=s1;
graduate s3=new graduate;
if(x instanceof Graduate)//检查x是不是Graduate的实例
   s3=(graduate)x;

对象之间怎么能用等号啊?

于java语言的多态性使得可以用一个子类的实例赋值给一个
父类的变量
这句话什么意思啊




8 个回复

正序浏览
本帖最后由 张世威 于 2012-7-17 14:29 编辑

1、 s3=(graduate)x;实际上不叫对象赋值,而是叫对象引用赋值,就是把x指向对象的地址存放到s3中

  如下图:
  

2、为什么子类可以赋给父类:因为子类继承自父类,子类可被我们调用的方法>=父类的,
               这样看来,子类包含了父类。
        ①比如说父类有:a、b、c三个可调方法
                     子类有: a、b、c 、d1、四个可调用方法
        ②子类赋给父类,父类调用abc,在子类中都可以调到
3、汽车和小轿车:可以说小轿车是汽车,能说汽车是小轿车吗???

评分

参与人数 1技术分 +1 收起 理由
黑马张扬 + 1

查看全部评分

回复 使用道具 举报
if(x instanceof Graduate)//检查x是不是Graduate的实例
   s3=(graduate)x;

如果x是Graduate的实例,就把x转成graduate类型,并把这个对象的引用传递给s3.
回复 使用道具 举报
x=s1是把s1的引用传给x,s3=new graduate();
回复 使用道具 举报
对象之间怎么能用等号啊? 关于你的这个问题,要从JAVA的底层的理解出发,JAVA,是一门“看似”没有指针的语言,其实从底层来看,JAVA的几乎所有都是指针,这样也就能理解,为什么对象之间可以用等号,因为每个对像实际上就对内存的索引!
对于你的第二个问题,何如,B(类) 继承 A(类)
那 B类的一个对象b(B b = new B();),可以赋值A类的对象(A a  =  b;)从底层来说,由于B继承了A,所以在构造b时,实现上是先构造A类的相关属性,再构造B类的相关属性,所以对象b包含了A类的所有属性(除构造方法),所以可以把B类对象b赋值给它的父类A的变量
回复 使用道具 举报
  1. undergraduatestudent s1=new undergraduatestudent();

  2. graduate s2=new graduate();

  3. Student x;

  4. x=s1; //向上转型,父类通过子类对象时实例化

  5. graduate s3=new graduate;

  6. if(x instanceof Graduate)//检查x是不是Graduate的实例

  7.    s3=(graduate)x;//向下转型
复制代码
通过你的代码可以看出Student是父类,undergraduatestudent和Graduate是子类;
关于你的问题:
对象之间怎么能用等号啊?
那是因为在类的多太重有向上转型和向下转型的用法;
向上转型:父类对象通过子类对象去实例化,实际上就是对象的向上转型。向上转型不需要进行强制类型转换,但是向上转型会丢失精度;
你的代码中的 x=s1 就是向上转型;
向下转型:父类的对象可以转换为子类对象,但是需要注意的是,这时必须进行强制的类型转换;
你的代码中 s3=(graduate)x 就是向下转型;

不过以后代码要贴全啊,,,这样让人自己去分析你代码的功能很麻烦,,,还有你那个类到底是Graduate还是graduate?编译的时候没有报错?

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
s3=(graduate)x;
这是赋值,不是等号吧?意思就是将x所引用的对象强转为graduate类型赋值给s3变量

java语言的多态性使得可以用一个子类的实例赋值给一个父类的变量
意思就是,动物是父类,猫和狗是子类,因此猫和狗是动物,所有可以将猫的对象赋给动物类型的变量
编程中,所有的对象都可以赋值给Object。
回复 使用道具 举报
s3=(graduate)x; 这句话做了两件事 首先将x强转为graduate类型  然后对象x的地址值赋值给对象s3  s3的引用指向了对象x
=代表着赋值,对象的引用也可以进行赋值啊
至于第二问  举个例子List list =new ArrayList();这是一个面向父类编程 其中变量list就是指向了自己的子类实例对象new ArrayList();
回复 使用道具 举报
graduate s3=new graduate;    ?
你把代码贴全。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马