有个singer接口,里面有sing();sleep();
还有个paiter接口,有paiting();eating();
有学生类实现了这两个接口,还有一个自己的study();
还有个teacher类 也实现了这两个接口 还有自己的teach();问题是:Singer s=new Student();  只能访问s.sing();  s.sleep();  不能访问自己的study();
访问要study();可以Student t=new Student(); t.study();这样感觉不是比较麻烦吗?接口的优势体现不出来了呀。
希望大牛们指点下小菜鸟
在线等帮助  qq:393192074   非诚勿扰,水平差不多也勿扰多谢

解决方案 »

  1.   

    非诚勿扰,水平差不多也勿扰 #。#!
    Singer s 本身就没study()方法
      

  2.   

    是没有哇,我的意思是要访问study();呢
      

  3.   

    编译的时候只检查声明的类型。也就是等号前面的。
    声明的类型里没有study方法所以不能访问。
      

  4.   

    有学生类实现了这两个接口,还有一个自己的study();
    说明只有Student 有这study()实例方法 Student t=new Student(); t.study();这样感觉不是比较麻烦吗?
    你可以把study()方法加在singer接口里 在Student 实现就是了
    或者 写成静态方法
      

  5.   


    那如果实现类里面既实现了接口的方法 有扩展了自己的方法,是不是要new出一个接口类型的对象,访问接口里面的方法  再new一个类的对象 访问自己的方法?
      

  6.   


    你能new一个接口类型的对象就算你牛。
    这种情况直接用实现类的类型来定义变量就好了。
    Student t=new Student();
    t.study();
      

  7.   

    实现类可以扩展方法,但是接口没定义的方法,是不能直接通过接口变量来调用的,可以转换为实现类去掉用

    Singer s = new Student(); //s是接口Singer类型的变量,但是指向一个具体实现类Student的实例
    if (s instanceof Student) { //可以通过判断接口变量是否是某个实现类来调用实现类的扩展方法
       s.study();
    }
      

  8.   

    顶楼上 lz好好学习ha 。。
      

  9.   

    Java Polymophism 能正确调用方法,就是应用“Runtime Type Identification ”RTTI,
    Singer s=new Student();
    这里的s是借口类型的引用指向实现类类型。
    关于你的问题 Singer s = new Student();
    ((Student)s).study();  ]
    这就行了,s是指向Student类型的对象,向下强制类型转换。
      

  10.   

    动态绑定,你指定的是singer接口的实现,当然没有study的方法
      

  11.   

    这涉及到Java的多态(Polymorphism)与晚绑定(Late Binding)
    Singer s = new Student();
    使用了多态,父类的引用s指向了子类的对象Student()
    当使用多态方式调用方法时,首先检查父类中是否有该study()方法,如果没有编译错误;如果有就调用子类的study()方法.
    因为Singer接口中并没有study()方法,所以在子类调用时需要向下强制类型转换:
    ((Student)s).study();一些自己的见解,希望对你有帮助!