这是有效的摘要 class 吗?

Is this a valid abstract class?

这是有效的摘要吗class?

我知道抽象classes不能实例化,所以我对实例变量language和构造函数Programmer存疑。它还实现了一个未声明为 defaultwriteCode 方法。如果我没记错的话,唯一可以在抽象 class 中实现的方法是那些具有默认实现的方法。

public abstract class Programmer {
     private String language;
     public Programmer (String language) {
          this.language = language;
     }
     public void writeCode() {
          System.out.println("Written in " + language);
     }
}

谢谢!

摘要 classes 是部分实现。有时,如上例所示,唯一阻止 class 被实例化的是 abstract 修饰符本身!

如果抽象 class 有构造函数,那么这意味着子 classes 必须调用其中一个构造函数(通过在它们的构造函数中调用 super(...)


更广泛地说,您似乎混淆了接口和抽象 类。接口是一种契约,它们指定 class 应该如何表现但不提供任何实现。摘要 类 是一些代码的特定部分实现。

当您需要其他人提供行为但您不关心它如何工作时,(广泛地)使用接口。 Abstract 类 当你想帮助人们提供行为时使用,但你仍然需要他们提供一些细节。

由于这些定义重叠,因此经常会看到同时提供抽象 类 和接口,例如java.swing.*.

中的各种适配器

正如你所说,抽象的classes不能被实例化。但是,当创建任何抽象class的子class时,其构造函数中的第一句是对super()的调用,它不过是其父[=16]的构造函数的表示=], 摘要 class.

一个抽象 class 可以有实例变量和方法。甚至可以有一个没有任何抽象方法的抽象class。但是,抽象方法只能在抽象中声明class.

您正在混合抽象 classes 和接口概念。接口不能有实例变量,任何实现的方法都必须以 static 或 default 修饰符为前缀。

这是摘要的正确示例 class。回答您的问题:

  • default 关键字在接口中使用(从 java 8 开始),您可以在其中实现默认方法实现,抽象 class 可以像任何普通方法一样具有方法实现javaclass

  • 在抽象中具有构造函数 class 强制在扩展 class 中具有构造函数,以便可以正确构造基础抽象 class(例如实例化的字段等)

  • 抽象 class 无法实例化,但任何其他 class 都可以拥有私有字段并在内部使用它们,如果它们受到保护然后扩展 class es 也将能够直接访问它们。

在我看来,您混淆了抽象 class 和接口。

抽象class包含一个构造函数,因为当创建基于抽象class的实例化class时,它将调用super()来执行来自抽象的代码class.

实例变量也是类似的东西。从抽象 class 开发的 class 然后可以访问 language 并能够使用它。

就默认而言,这是最佳做法,但没有绝对要求。

是的,这是有效的 abstract class。

抽象classes可以有构造函数、实例变量和具体方法。

与常规 classes 的主要区别在于它们可以 声明 abstract 方法,将实现委托给 non-abstract child classes(这里不是这种情况,你没有 abstract 方法)。

另一个区别是它们不能直接初始化,即使它们确实提供了可访问的构造函数。

抽象 class 的构造函数通常用于在内部初始化值,并从 child classes 或匿名调用。

参见文档 here

例子

鉴于...

public abstract class Programmer {
    private String language;

    public Programmer(String language) {
        this.language = language;
    }

    public void writeCode() {
        System.out.println("Written in " + language);
    }
}

...和...

public class JavaProgrammer extends Programmer {
    public JavaProgrammer() {
        super("Java");
    }
}

混凝土childclass

new JavaProgrammer().writeCode(); // prints "Java"

匿名class(注意空class正文{}

new Programmer("JavaScript"){}.writeCode(); // prints "JavaScript"