首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java -接口真的没有状态或行为吗?

Java -接口真的没有状态或行为吗?
EN

Software Engineering用户
提问于 2019-05-05 22:22:09
回答 3查看 1.5K关注 0票数 5

在网上我总是读到这样的东西

Java接口没有状态,也没有行为

如果您查看状态的公共定义是什么,那么您很可能以

对象有什么,学生有名字,姓,年龄等

问题是,由于Java 8具有它们的默认方法,所以我也可以定义一些字段并使用它们以及函数。

所以,我想知道说Java中的接口没有状态和行为是否仍然有效?

代码语言:javascript
复制
public interface DefaultInterface {

    List<Integer> numbers = new LinkedList<>();

    default List<Integer> getNumbers() {
        return numbers;
    }

    default void addId(int value) {
        numbers.add(value);
    }

    default IntStream perform(String string) {
        return string.chars();
    }

    void implementMe();
}
EN

回答 3

Software Engineering用户

发布于 2019-05-05 22:58:59

在很长一段时间内,Java接口只能是“纯”接口,而没有默认的实现、状态和行为。默认接口实现是一种较新的语言特性。它出现在Java 8 (2014)中。

使用默认实现的接口背后的意图是允许向接口添加方法,而不必更改实现该接口的现有类。新方法获得默认实现(而旧方法可能没有默认实现),实现接口的现有类不必实现新方法。

具有默认实现的接口也可以像用于多个实现继承的抽象类一样使用。

让我们看一下其他语言的接口。

  • C++没有特殊的interface关键字。使用class关键字和纯虚拟函数声明纯接口(没有默认实现)。
  • C#确实有一个特殊的interface关键字,但接口没有默认实现。因此,使用interface声明的类型只能是没有实现的纯接口。
票数 5
EN

Software Engineering用户

发布于 2019-05-06 15:50:16

这里可能不清楚的一点是,这个定义:

代码语言:javascript
复制
List<Integer> numbers = new LinkedList<>();

是接口上下文中的隐式staticfinal,而在任何(其他)类级别的上下文中,它都是隐式的成员声明。我认为可以公平地说,这有点令人困惑。这就是为什么在IDE中设置语法着色以将静态(和/或静态-最终)声明显示为不同颜色(如果可能的话)的原因之一。

所以这里的状态是与接口类相关联的,而不是它的实例。因此,“说Java中的接口没有状态是有效的”这个问题有点不清楚。是的,接口类可以具有状态,但大多数人在谈论状态时可能并不是这样想的,例如,“field”通常指的是成员级引用,而不是类级,除非您指定了“静态字段”

票数 4
EN

Software Engineering用户

发布于 2019-05-06 14:39:01

通过添加默认方法,接口确实有行为。但是,对于状态可能不是这样(取决于国家的定义):

接口中的List<Integer> numbers = new LinkedList<>();具有隐式修饰符public static final,这意味着numbers不是任何实现类中的字段,而是“静态/类常量”,而不是作为接口实例的任何对象的状态的一部分。由于任何状态(例如属性和字段)通常都是实现细节,因此它不属于接口定义。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/391458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档