Java 这是一个有效的抽象类吗?

Java 这是一个有效的抽象类吗?,java,constructor,abstract-class,default,abstract,Java,Constructor,Abstract Class,Default,Abstract,这是一个有效的抽象类吗 我知道抽象类不能实例化,所以我怀疑实例变量language和构造函数Programmer。它还实现了一个未声明为default的writeCode方法。如果我没记错的话,在抽象类中唯一可以实现的方法就是那些具有默认实现的方法 public abstract class Programmer { private String language; public Programmer (String language) { this.la

这是一个有效的抽象类吗

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

public abstract class Programmer {
     private String language;
     public Programmer (String language) {
          this.language = language;
     }
     public void writeCode() {
          System.out.println("Written in " + language);
     }
}
  • 如果它是一个有效的抽象类,有人能解释为什么它包含构造函数吗

  • 此外,更广泛地说,抽象类可以有实例变量吗?若然,原因为何?这似乎与抽象类不能实例化的观点相反吗

  • 最后,如果有人对
    writeCode
    方法进行寻址,我会非常喜欢。为什么要实现它,而不使用
    默认值
    修饰符


谢谢

抽象类是部分实现。有时,就像上面的例子一样,唯一阻止类实例化的是
抽象
修饰符本身

如果抽象类有构造函数,则意味着子类必须调用其中一个构造函数(通过在其构造函数中调用
super(…)


更广泛地说,您似乎混淆了接口和抽象类。接口是一种契约,它们指定类的行为方式,但不提供任何实现。抽象类是某些代码的特定部分实现

当您要求其他人提供行为,但您不关心其工作方式时,可以(广泛地)使用接口。当您希望帮助他人提供行为,但仍要求他们提供一些细节时,可以使用抽象类


由于这些定义重叠,所以可以看到提供的抽象类和接口,例如
java.swing.*

中的各种适配器,正如您所说,抽象类不能实例化。但是,当创建任何抽象类的子类时,其构造函数中的第一句话是调用super(),它只是其父类抽象类的构造函数的表示形式

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


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

这是抽象类的正确示例。回答您的问题:

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

  • 在抽象类中具有构造函数意味着在扩展类中具有构造函数,以便可以正确构造底层抽象类(例如,实例化的字段等)

  • 抽象类不能被实例化,但由于任何其他类都可以拥有私有字段并在内部使用它们,如果它们受到保护,那么扩展类也可以直接访问它们


在我看来,你把抽象类和接口混淆了。

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

实例变量与此类似。从抽象类开发的类将访问
语言
,并能够使用它


就默认值而言,这是最佳实践,但没有绝对要求它存在。

是的,这是一个有效的
抽象类

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

与常规类的主要区别在于,它们还可以声明
abstract
方法,将实现委托给非抽象子类(这里不是这种情况,您没有
abstract
方法)

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

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

见文件

示例

鉴于

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");
    }
}
具体的子类

new JavaProgrammer().writeCode(); // prints "Java"
匿名类(注意空的类主体
{}


是的!子类将需要在其构造函数中第一次调用
super(languaje);
。您似乎混淆了
接口
抽象类
任何类都可以声明
抽象
(这可能没有意义,但绝对合法)。您可能应该研究一下默认的
修饰符到底是什么。您应该真正定义“有效”的含义以获得更好的答案。因为在一个非常基本的层面上,您可以说它是否编译,它是否有效。您可以通过编译它来检查它是否编译。“java中的抽象类可以是一个完全可实例化的类”是令人困惑的,或者完全错误的,因为我们不能实例化抽象类。我们可以实例化其他不再抽象的类,但显式或隐式地扩展抽象类(如匿名类)。
new Programmer("JavaScript"){}.writeCode(); // prints "JavaScript"