首先 Talkable t =new students();new的是一个studens对象,说明一个类型是Talkable的引用变量指向的是 new Studens这个对象(这里记做a)而Studyable s = (Studyable)t;是强制转换 比如你 double d = 2.2,int i = (int)d;c和d指的对象时同一个吧?如果这个道理你明白了
那么Studyable s = (Studyable)t;s和t是同一个对象么?
同理S  s  t都是同一个对象。
希望对你有帮助

解决方案 »

  1.   

    S s 都指向t的内存地址,所以这个3个是一样的
      

  2.   

    学生实现了Talkable 和 Studyable两个接口,说明学生具有讲话和学习两个功能。
    Talkable t =new students();
    这句可以理解为创建一个students对象并标记为演讲者,new students()才是真正的对象,我们也可以形象的为这个对象起名字叫张同学。
    t只是该对象的一个引用,或者说是他的一种称呼,一个标签。
    于是我把这句代码形象化为:
    Talkable 演讲者 =new 张同学; 
    于是张同学变成了演讲者。
    Studyable s = (Studyable)t;这句话,
    因为只有学生才具有学习功能,演讲者没有学习功能,此时我们需要恢复学生的身份(Studyable)t,将他标记为学习者Studyable s。
    可以把Studyable s = (Studyable)t;这句话形象为:
    Studyable 学习者 = (恢复学生身份)演讲者;
    而students S=(students)t;可形象化为:
    students 学生 = (恢复学生身份)演讲者;
    这句话是说把学生恢复为学生身份并把他标记为学生,学生具有学习和讲话两个功能,
    当然可以S.speak(); S.study();了
    实际上,我们整个过程,操作的全是new students();这一个人,即张同学。我们也可以看出从头到尾只有这一个对象(其他的s,S,t都是一个引用,一个标签而已)。
      

  3.   

    图确实画的不错,其实原理就是和C里的指针差不多,只不过java一般叫引用
      

  4.   

    只有 new 的时候才产生了对象(堆中),所以这里面的对象只有 new students();
    语句左边的呢,都是对这个对象的引用(栈中),也就是说 Talkable t, Studyable s, students S 都是指向同一个对象,但是分别代表了不同的身份。
    作为 Talkable t,只知道有 speak()方法,在它视野中 无 study()
    作为 Studyable s,只知道有 study()方法,在它视野中 无 speak()
    作为 students S,也就是 new students() 所属的类,两个方法自然都知道。
    什么时候需要转型呢?就是用到与初始身份不同的身份所知道的方法的时候,需要转型(一般规律,就是用到子类特有的方法的时候,要转型)
      

  5.   

    建议你重新了解下多态的含义和接口的定义,而且你也多想想类和对象含义多态只是个概念。接口是一组方法的集合,不能实例化对象,但可以声明。
    你老师的意思应该是,你定义的students类实现了Talkable和Studyable两个接口,而你可以用Talkable和Studyable声明对象t而用new students()实例化对象,也就是说t被分配了内存(实际上t这个变量里存的只是一个内存地址指向你实例化的对象的内存块)
    而你Studyable s = (Studyable)t;
    students S=(students)t;这两句并没有用new实例化新的对象只是把t这个变量里存的对象赋值给了S和s所以他们是指向同一个对象。但是由于t和S、s声明不同所要强制转换成对应的数据类型。
    感觉你的概念太模糊了。建议你把面向对象这部分多读几遍充分理解下