Oracle说:“抽象类类似于接口。不能实例化它们,它们可能包含有或没有实现声明的方法组合。但是,使用抽象类,您可以声明非静态和最终的字段,并定义公共、受保护和私有的具体方法.”
我认为接口只能包含抽象方法,而抽象方法在定义上没有实现。那么,为什么Java文档说抽象类类似于接口,因为它们可能包含有或没有实现声明的方法的组合?
发布于 2022-09-10 13:42:44
因为
我认为接口只能包含抽象方法和抽象方法。
是不正确的。或者说,它在Java1.7之前是正确的,并且从那时起一直是不正确的,因为java8引入了方法机制。换句话说,在这一点上,大约15年来一直是不正确的。
这是合法的java,现在:
interface Map<K, V> {
public V get(Object key);
public boolean containsKey(Object key);
public default V getOrDefault(Object key, V defaultValue) {
return containsKey(key) ? get(key) : defaultValue;
}
}
default
方法进一步模糊了抽象类和接口之间的界限。任何实现都可以覆盖它们,如果需要的话。关于他们的几条规则:
implements
编译器将拒绝编译该,唯一的出路是显式定义该方法。如果你愿意的话,你可以用InterfaceName.super.methodName(params);
来指代你想要的任何激励。这“解决”了这个“钻石问题”。换句话说,将接口类型放在implements
子句中的顺序仍然无关紧要。public static final
)。getOrDefault
(其中的实际存在),并且从java 8开始就这样做了。通常,它们并不是真正的“意思”来扩展接口所代表的内容,因为您不能挥舞魔杖,让实现者从任何地方扩展实现。在很少的情况下,您可以完全基于不涉及任何字段的默认行为来扩展接口所代表的内容。在这种情况下,您也可以使用default
机制。default
关键字是必需的。static
方法插入其中的能力,这很不错。private
方法。此功能只允许您为default
方法编写助手方法。https://stackoverflow.com/questions/73675218
复制相似问题