在我的一次采访中,我被要求解释Interface和Abstract类之间的区别。
这是我的回应:
Java接口的方法是隐式抽象的,不能具有实现。Java抽象类可以具有实现默认行为的实例方法。
在Java接口中声明的变量默认为final。抽象类可能包含非最终变量。
默认情况下,Java接口的成员是公共的。Java抽象类可以具有类成员的常用风格,例如private,protected等。
Java接口应使用关键字“ implements”来实现;Java抽象类应使用关键字“ extends”进行扩展。
一个接口只能扩展另一个Java接口,一个抽象类可以扩展另一个Java类并实现多个Java接口。
Java类可以实现多个接口,但只能扩展一个抽象类。
但是,面试官并不满意,并告诉我此描述代表“ 书本知识 ”。
他要求我提供更实际的答复,并通过实际示例说明何时在接口上选择抽象类。
我哪里做错了?
我先给你一个例子:
public interface LoginAuth{ public String encryptPassword(String pass); public void checkDBforUser(); }
假设你的应用程序中有3个数据库。然后,该数据库的每个实现都需要定义以上两种方法:
public class DBMySQL implements LoginAuth{ // Needs to implement both methods } public class DBOracle implements LoginAuth{ // Needs to implement both methods } public class DBAbc implements LoginAuth{ // Needs to implement both methods }
但是,如果encryptPassword()不依赖数据库又对每个类都是相同的呢?那么以上将不是一个好的方法。
encryptPassword()
相反,请考虑以下方法:
public abstract class LoginAuth{ public String encryptPassword(String pass){ // Implement the same default behavior here // that is shared by all subclasses. } // Each subclass needs to provide their own implementation of this only: public abstract void checkDBforUser(); }
现在,在每个子类中,我们只需要实现一个方法-该方法依赖于数据库。