这样的事情可能
abstract class AbstractSuperClass {
private Entity entity;
public AbstractSuperClass(Entity entity) {
this.entity = entity;
}
public abstract void operate();
}
public class SubClass extends AbstractSuperClass {
public void operate() {
this.entity.doVoidMethod(); // is this.entity defined in instances of SubClass ?
}
}
// ... somewhere else
Entity instantiatedEntity = new Entity();
SubClass instance = new SubClass(instantiatedEntity);
instance.operate(); // does this call this.entity.doVoidMethod() inside of instance?
我希望能够跳过在我写作的抽象类的子类中编写自己的构造函数。所有构造函数在每个子类中都是相同的。
如果我跳过为抽象类的子类编写构造函数(这是否允许?)抽象类'构造函数默认使用?
答案 0 :(得分:1)
首先,如果你没有定义构造函数,则会考虑一个没有参数的默认构造函数
换句话说,如果要使用new SubClass(instantiatedEntity);
,则必须在SubClass
中定义构造函数,该构造函数采用类型为Entity
的单个参数。
换句话说,如果要传递参数,则不能跳过编写自己的构造函数。
其次,在SubClass
内,您无法拨打this.entity.doVoidMethod();
。这是因为entity
属性在基类中是私有的,因此SubClass无法访问。
此外,您在AbstractSuperClass
内定义了public abstract Operate();
。你可能意味着public abstract void operate();
。 SubClass中也存在类似的错误。
答案 1 :(得分:1)
我希望能够跳过在我写作的抽象类的子类中编写自己的构造函数。所有构造函数在每个子类中都是相同的。
你不能。构造函数不是用Java继承的:
唯一的例外是default constructor。但严格来说,它不是继承。如果没有构造函数,则添加默认构造函数,它将调用>>> print(True and False) and (True or False)
False # <-- from print, None doesn't get printed
>>> print(print(True and False) and (True or False))
False # <-- from the inner print
None # <-- None gets printed by the outer print
>>>
。
如果我跳过为抽象类的子类编写构造函数(这是否允许?)抽象类&#39;构造函数默认使用?
没有。超类的构造函数既不是继承的,也不是复制的。
答案 2 :(得分:-1)
根据上面的代码,您使用的子类是从抽象类扩展而来。
abstract class A{
A(){
//todo: some work
}
abstract methodA();
methodB(){
//todo:something: implementation within the abstract class.
}
}
class B extends A{
B(){
super(this);
}
}
我相信使用抽象构造函数你会使用super关键字。
答案 3 :(得分:-1)
一些想法(1)你应该让实体&#34;受保护&#34;而不是&#34;私人&#34; - 那就是你如何在子类中使它,(2)它有助于使用可以由子类继承的访问器方法(getter / setter),这与非默认构造函数不同,(3)操作方法需要返回type(我在下面使用void),(4)操作方法需要相同的签名(类型敏感的名称和参数类型)才能覆盖(5)使用@Override注释重写方法是一种好习惯。
public abstract class AbstractSuperClass {
protected Entity entity;
public AbstractSuperClass() {
}
public AbstractSuperClass(Entity entity) {
this.entity = entity;
}
public setEntity(Entity entity) {
this.entity = entity;
}
public abstract void operate();
}
public class SubClass extends AbstractSuperClass {
@Override
public void operate() {
this.entity.doVoidMethod(); // protected entity is available in subclass
}
}
// ... somewhere else
Entity instantiatedEntity = new Entity();
SubClass instance = new SubClass(); // default constructor
instance.setEntity(instantiatedEntity); // inherited method
instance.operate(); // yes calls entity.doVoidMethod()