有个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 非诚勿扰,水平差不多也勿扰多谢
Singer s 本身就没study()方法
声明的类型里没有study方法所以不能访问。
说明只有Student 有这study()实例方法 Student t=new Student(); t.study();这样感觉不是比较麻烦吗?
你可以把study()方法加在singer接口里 在Student 实现就是了
或者 写成静态方法
那如果实现类里面既实现了接口的方法 有扩展了自己的方法,是不是要new出一个接口类型的对象,访问接口里面的方法 再new一个类的对象 访问自己的方法?
你能new一个接口类型的对象就算你牛。
这种情况直接用实现类的类型来定义变量就好了。
Student t=new Student();
t.study();
即
Singer s = new Student(); //s是接口Singer类型的变量,但是指向一个具体实现类Student的实例
if (s instanceof Student) { //可以通过判断接口变量是否是某个实现类来调用实现类的扩展方法
s.study();
}
Singer s=new Student();
这里的s是借口类型的引用指向实现类类型。
关于你的问题 Singer s = new Student();
((Student)s).study(); ]
这就行了,s是指向Student类型的对象,向下强制类型转换。
Singer s = new Student();
使用了多态,父类的引用s指向了子类的对象Student()
当使用多态方式调用方法时,首先检查父类中是否有该study()方法,如果没有编译错误;如果有就调用子类的study()方法.
因为Singer接口中并没有study()方法,所以在子类调用时需要向下强制类型转换:
((Student)s).study();一些自己的见解,希望对你有帮助!