本人最近刚刚再学习java,在论坛里发现了一个有趣的问题,
原址:http://bbs.csdn.net/topics/391830364#new_post
抽象类和接口中有同一个抽象方法,一个类继承了那个抽象类并实现了那个接口,那么这个子类重写的方法是调用接口的还是抽象类的?
例如:
public abstract class abstractClass{
public abstract void test();
}
public interface interfaceClass{
public abstract void test();
}
public class E extends abstractClass implements interfaceClass{
@Override
public void test(){
//TODO Auto-generated method stub
}
}
那么子类是调用抽象类中的test()还是接口中的test()呢?
在eclipes中将上述实现:
代码如下:
package day1002;
abstract class dada1
{
public abstract void test(int a,int b);//抽象类中的方法
}
interface interfaceclass
{
public abstract void test(int x,int y);
//接口中的方法
}
class E extends dada1 implements interfaceclass{
public void test(int a,int b)
{
System.out.println(a+b);
}
}
public class dada {
public static void main(String[] args) {
// TODO Auto-generated method stub
//下面是实验用的第一种方法①
/*
E e = new E();
dada1 abs=new E();
*/
//下面是第二种方法②
/*
dada1 abs=new E();
abs.test(1,3);
*/
//下面是第三种方法③
/*
InterfaceClass inter=new E();
inter.test();
*/
}
}
把光标放在抽象类或接口中的方法名上: ctrl+shift+g 可以查看这个方法的引用,如图:
在Search窗口中可以看到如下结论:
**如果只写①的话,我发现两个方法都可以聚焦到main方法中
图片就不贴了**
如果只写②的话,在接口中的方法是找不到引用的
**翻译过来就是 workspace 中没有引用,0匹配
如果只写③的话,在抽象类中的方法是找不到引用的**
还是要看main中是怎么 引用的
下面摘录了 一个英文网址:
http://lvvbbe.com/questions/8147988/what-is-the-difference-between-an-interface-and-abstract-class
有兴趣的可以看看。
关于abstract 与接口的比较:
1.abstract 类和接口都可以使用abstract 方法
2.接口中只可以有常量,不能有变量,而abstract 变量中既可以有常量也可以有变量。
3.abstract 类中也可以非abstract 方法,接口不可以
那么在设计程序的时候应该怎么确定是使用接口呢 还是抽象类呢
。abstract 类除了提供重要的需要子类重写的abstract 方法外,也提供了子类可以继承的变量和非abstract 方法,如果某个问题需要使用继承才能更好的解决,比如自乐除了需要重写父类中的abstract 方法,还需要从父类继承一些变量或者继承一些重要的非abstract 的方法,就可以考虑到使用abstract 类,如果某个问题不需要继承,只是需要若干个给出某些重要的abstract 方法的实现,那么可以考虑用接口。
刚学,自己做的总结。希望有所帮助。