【问题标题】:Why do abstract classes support static and instance blocks and interfaces don't? [duplicate]为什么抽象类支持静态和实例块而接口不支持? [复制]
【发布时间】:2019-04-19 11:17:53
【问题描述】:

为什么抽象类支持静态和实例块而接口不支持?即使我们无法实例化抽象类,抽象类也支持构造函数。

abstract class Abs{
    final int x;
    final int y;
    final static int z;

    public Abs(){
        x=10
    }

    {
        y=10;
    }

    static{
        z=10;
    }
}

在上面的代码中,我在运行时初始化了一个变量,但同样的事情不适用于接口。为什么?

【问题讨论】:

  • 接口不是一个类,它没有构造函数、变量或任何代码,只有方法签名,Java 8 之后的default 方法实现除外。
  • interface 也有变量,默认修饰符 public static 和 final。如果接口不是类那么为什么编译后生成.class文件

标签: java


【解决方案1】:

顾名思义,接口主要用于定义合同而不是实现(在 Java 8 之前),但您可以初始化字段。

但是,您可以拥有一个包含任意数量代码的嵌套类或枚举。

【讨论】:

  • 允许初始化字段 -> 允许初始化 *static* 字段?
  • 接口没有实例字段,唯一允许的静态字段是常量。
【解决方案2】:

界面

不要有构造函数或初始化块,因为你不能创建接口的实例(只有实现的类)。所有变量都是public static final,所有方法都是public。方法可以使用 default 关键字进行默认实现。

抽象类

这是一个普通的类,但是你不能创建这个类的实例。但是它们有任何变量、静态块和构造函数(公共构造函数没用,因为只有嵌套类可以调用它,所以建议将所有构造函数标记为protected)。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 2011-05-06
    • 2020-02-12
    • 1970-01-01
    • 2015-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多