3 回答
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();}
现在在每个子类中,我们只需要实现一个方法 - 与数据库相关的方法。
我尽我所能,希望这会清除你的疑虑。
TA贡献1796条经验 获得超7个赞
在这个世界上没有什么是完美的。他们可能期待更多实用的方法。
但是在您的解释之后,您可以使用稍微不同的方法添加这些行。
接口是规则(规则,因为您必须为它们提供一个您不能忽略或避免的实现,以便它们像规则一样强制执行),这些规则在软件开发中的各个团队之间起着共同的理解文档的作用。
接口提供了想要做什么但不知道如何做的想法。因此,实现完全依赖于开发人员遵循给定的规则(意味着给定方法的签名)。
抽象类可以包含抽象声明,具体实现或两者。
抽象声明就像要遵循的规则,具体实现就像指南(你可以按原样使用它,或者你可以通过覆盖并给它自己的实现来忽略它)。
此外,具有相同签名的哪些方法可以改变不同上下文中的行为作为接口声明被提供作为在不同上下文中相应地实现的规则。
编辑: 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()方法提供实现,否则编译器将抛出编译时错误。
添加回答
举报