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"