我最近接受过两次电话采访,其中我被问及接口和抽象类之间的区别.我已经解释了他能想到的每一个方面,但似乎他们在等我提一些具体的东西,我不知道它是什么.
根据我的经验,我认为以下是正确的.如果我错过了重点,请告诉我.
接口:
在接口中声明的每个单独的方法都必须在子类中实现.接口中只能存在事件,代理,属性(C#)和方法.一个类可以实现多个接口.
抽象类:
只有抽象方法必须由子类实现.Abstract类可以有实现的常规方法.Abstract类还可以在Events,Delegates,Properties和Methods旁边有类变量.由于C#中不存在多重继承,因此类只能实现一个抽象类.
毕竟,面试官想出了一个问题"如果你有一个只有抽象方法的抽象类怎么办?那么它与界面会有什么不同?" 我不知道答案,但我认为这是上面提到的继承权吗?
另一位采访者问我,如果你在界面中有一个Public变量,那么它与Abstract Class有什么不同?我坚持认为你不能在界面中有一个公共变量.我不知道他想听到什么,但他也不满意.
另见:
假设我有两个类,A和B.A类被定义为抽象,而B扩展了这个抽象类,最后我测试结果,两个类都是同一个包的一部分.
public abstract class A {
protected abstract void method1();
protected void method2() {
System.out.println("This is Class A's method");
}
}
public class B extends A {
@Override
protected void method1() {
System.out.println("This is B's implementaiton of A's method");
}
}
Run Code Online (Sandbox Code Playgroud)
现在当我测试它们时:
B b = new B();
b.method1();
b.method2();
Run Code Online (Sandbox Code Playgroud)
我得到预期的输出:
This is B's implementaiton of A's method
This is Class A's method
Run Code Online (Sandbox Code Playgroud)
问题:
@Override关键字的目的是什么,因为如果省略它,它仍然可以正常工作. method2()在B中实现.然后输出更改为B中使用的内容.这是否也会覆盖父类方法?那么在A类中将方法明确定义为抽象的目的是什么?