这是有效的摘要 class 吗?
Is this a valid abstract class?
这是有效的摘要吗class?
我知道抽象classes不能实例化,所以我对实例变量language
和构造函数Programmer
存疑。它还实现了一个未声明为 default
的 writeCode
方法。如果我没记错的话,唯一可以在抽象 class 中实现的方法是那些具有默认实现的方法。
public abstract class Programmer {
private String language;
public Programmer (String language) {
this.language = language;
}
public void writeCode() {
System.out.println("Written in " + language);
}
}
如果它是一个有效的抽象class,有人可以解释为什么它包含一个构造函数吗?
另外,更广泛地说,抽象classes可以有实例变量吗?如果是这样,为什么?这似乎与抽象 classes 不能实例化的想法背道而驰吗?
最后,如果有人解决 writeCode
方法,我会很高兴。为什么在没有 default
修饰符的情况下实施?
谢谢!
摘要 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"
这是有效的摘要吗class?
我知道抽象classes不能实例化,所以我对实例变量language
和构造函数Programmer
存疑。它还实现了一个未声明为 default
的 writeCode
方法。如果我没记错的话,唯一可以在抽象 class 中实现的方法是那些具有默认实现的方法。
public abstract class Programmer {
private String language;
public Programmer (String language) {
this.language = language;
}
public void writeCode() {
System.out.println("Written in " + language);
}
}
如果它是一个有效的抽象class,有人可以解释为什么它包含一个构造函数吗?
另外,更广泛地说,抽象classes可以有实例变量吗?如果是这样,为什么?这似乎与抽象 classes 不能实例化的想法背道而驰吗?
最后,如果有人解决
writeCode
方法,我会很高兴。为什么在没有default
修饰符的情况下实施?
谢谢!
摘要 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"