为了账号安全,请及时绑定邮箱和手机立即绑定

我该如何解释Interface和Abstract类之间的区别?

我该如何解释Interface和Abstract类之间的区别?

心有法竹 2019-08-14 16:14:08
我该如何解释Interface和Abstract类之间的区别?在我的一次访谈中,我被要求解释Interface和Abstract类之间的区别。这是我的回答:Java接口的方法是隐式抽象的,不能有实现。Java抽象类可以具有实现默认行为的实例方法。在Java接口中声明的变量默认为final。抽象类可能包含非最终变量。默认情况下,Java接口的成员是公共的。Java抽象类可以具有类似私有,受保护等类通常的类成员。应使用关键字“implements”实现Java接口; 应使用关键字“extends”扩展Java抽象类。接口只能扩展另一个Java接口,抽象类可以扩展另一个Java类并实现多个Java接口。Java类可以实现多个接口,但它只能扩展一个抽象类。然而,面试官并不满意,并告诉我这个描述代表了“ 书本知识 ”。他告诉我一个更实际的回答,解释我何时会使用实际例子在界面上选择一个抽象类。我哪里做错了?
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

我先给你举个例子:

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()不依赖于数据库,那么每个类都是一样的呢?那么以上就不是一个好方法。

相反,请考虑这种方法:

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();}

现在在每个子类中,我们只需要实现一个方法 - 与数据库相关的方法。

我尽我所能,希望这会清除你的疑虑。


查看完整回答
反对 回复 2019-08-14
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

在这个世界上没有什么是完美的。他们可能期待更多实用的方法。

但是在您的解释之后,您可以使用稍微不同的方法添加这些行。

  1. 接口是规则(规则,因为您必须为它们提供一个您不能忽略或避免的实现,以便它们像规则一样强制执行),这些规则在软件开发中的各个团队之间起着共同的理解文档的作用。

  2. 接口提供了想要做什么但不知道如何做的想法。因此,实现完全依赖于开发人员遵循给定的规则(意味着给定方法的签名)。

  3. 抽象类可以包含抽象声明,具体实现或两者。

  4. 抽象声明就像要遵循的规则,具体实现就像指南(你可以按原样使用它,或者你可以通过覆盖并给它自己的实现来忽略它)。

  5. 此外,具有相同签名的哪些方法可以改变不同上下文中的行为作为接口声明被提供作为在不同上下文中相应地实现的规则。

编辑: Java 8有助于在接口中定义默认和静态方法。

public interface SomeInterfaceOne {

    void usualAbstractMethod(String inputString);

    default void defaultMethod(String inputString){
        System.out.println("Inside SomeInterfaceOne defaultMethod::"+inputString);
    }}

现在当一个类实现SomeInterface时,并不是必须为接口的默认方法提供实现。

如果我们有另外一个接口,有以下方法:

public interface SomeInterfaceTwo {

    void usualAbstractMethod(String inputString);

    default void defaultMethod(String inputString){
        System.out.println("Inside SomeInterfaceTwo defaultMethod::"+inputString);
    }}

Java不允许扩展多个类,因为它导致“钻石问题”,其中编译器无法决定使用哪个超类方法。使用默认方法,接口也会出现菱形问题。因为如果一个类正在实现两者

SomeInterfaceOne and SomeInterfaceTwo

并且没有实现常见的默认方法,编译器无法决定选择哪一个。为了避免这个问题,在java 8中必须实现不同接口的通用默认方法。如果任何类正在实现上述接口,则必须为defaultMethod()方法提供实现,否则编译器将抛出编译时错误。


查看完整回答
反对 回复 2019-08-14
  • 3 回答
  • 0 关注
  • 756 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信