由于Java 9允许我们在接口中定义private
和private static
方法,interface
和class
的剩余差异是什么?
而且,Java是否正在慢慢走向多重继承?
答案 0 :(得分:43)
Java 9中的私有接口方法与其他私有方法的行为完全相同:它们必须具有正文(即使在抽象类中),并且既不能被子类调用也不能被子类覆盖。因此,它们并不真正与继承相互作用。谈论哪个(特别是多重继承),有(至少?)三种:
String
是 Object
。 Java允许从第一天开始多次继承类型(通过接口)。正如您所看到的,私有接口方法不会在此处添加任何内容。
关于接口和类如何比较的问题,有两个主要区别:多重继承和状态。接口支持前者,类可以拥有后者。由于国家在典型的OOP中很重要,因此课程仍然具有相关性。
如果某个接口有一种方法可以强制某个实现具有特定的非公共字段或直接定义一个,那么游戏就会发生变化,接口可能会与类竞争。
答案 1 :(得分:28)
子类不会继承私有方法,因此此功能不会影响实现类。我相信接口中的私有方法允许我们在默认方法之间共享代码。
Java接口仍然不能拥有非静态成员。这是一个很大的区别,而不是IMO的多重继承。
答案 2 :(得分:20)
Java 9接口仍然不能包含字段和构造函数。这在类和接口之间产生了巨大的差异,因此Java 9远非多重继承。
答案 3 :(得分:2)
版本9中的Java接口具有私有方法,但是静态私有。引入该功能以允许模块化方法。一个函数应该使用一个职责而不是使用冗长的默认方法。它与多重继承无关。 私有静态方法越多,您编写干净且可重用的代码就越多。无论如何,无论是公共还是受保护的静态方法都无法覆盖。
答案 4 :(得分:1)
尽管这是一个古老的问题,但我也要提供我的意见:)
抽象类:在抽象类内部,我们可以声明实例 子类必需的变量
接口:接口内部的每个变量始终是公共静态的 最后,我们无法声明实例变量
抽象类:抽象类可以讨论对象的状态
接口:接口永远无法谈论对象的状态
抽象类:在抽象类内部,我们可以声明构造函数
接口:在内部接口中,我们无法声明构造函数作为
的目的
构造函数用于初始化实例变量。所以呢
如果我们不能有实例,是那里的构造函数的需要
接口中的变量。
抽象类:在抽象类内部,我们可以声明实例和静态块
接口:接口不能具有实例和静态块。
抽象类:抽象类无法引用lambda表达式
接口:具有单个抽象方法的接口可以引用lambda表达式
抽象类:在抽象类内部,我们可以覆盖OBJECT CLASS方法
接口:我们无法在接口内覆盖OBJECT CLASS方法。
我将在笔记上结束:
界面中的默认方法概念/静态方法概念只是为了保存实现类,而不是提供有意义的有用实现。默认方法/静态方法是一种虚拟实现,“如果要使用它们,或者可以在实现类中覆盖它们(在默认方法的情况下)” 因此,只要有新方法,就可以避免在实现类中实现新方法在接口中添加了方法。因此,接口永远不能等于抽象类。