2017-06-21 87 views
1

如果我有这个抽象类:我应该定义一个构造函数是一个扩展抽象类的类吗?

package com.abc; 

public abstract class Player { 
    private String name; 

    public Player(String name) { 
     this.name = name; 
    } 

    public String getName() { 
     return name; 
    } 
} 

当我延长从抽象的一个新的类,它的新类默认使用继承的构造,或者我必须创建一个所谓的“超级构造“?

+0

我认为你应该调用'超级' – vm345

+0

它取决于抽象类是否有一个没有参数的构造函数 – AxelH

+1

@AxelH它会出现如此:'public Player(String name){'。 –

回答

5

默认情况下,它将使用默认的空构造函数;因为你明确提供了一个构造函数,所以你不会得到默认的构造函数。因此,您必须明确请致电super(String)。如果你不想要这个限制,那么你应该给你的Player添加一个空的构造函数。

protected Player() { // <-- only visible to sub-classes. 
    // ... implicit super(); 
} 
+0

很好的解决方法。有一个upvote。这是惯用的Java吗? – Bathsheba

+0

@Bathsheba地道的意义在哪?这是一个抽象类,所以无论如何都不能实例化。但我认为是的,也考虑包私有(例如无访问修饰符)......那么你可能在该包中有一个工厂(或生成器),只有它(或同一包中的其他东西)才能实例化该类。同样的想法,仅限于子类。 –

2

因为你的基类Player缺少默认构造函数(如果您提供的任何其他构造函数自动生成一个有效的删除),在派生类中的所有构造函数需要调用从String明确的构造。

您可以通过使用super并通过适当的值name来做到这一点。这必须是任何子类构造函数中的第一个语句。

3

默认情况下,如果您没有明确添加构造函数,Java编译器将在其中添加默认构造函数和super()。因为你Player类的有参数的构造函数,你需要调用super

我必须创建一个所谓的“超级”构造?

是的,你需要明确地添加默认构造函数。

public Player() {} 

或者,

您可以在子类与参数添加super()。如下所示:

public ChildClass(String name) { 
    super(name); 
} 

如果你想要,你也可以重载构造函数。 read more about constructor overloading和约super()

+0

我不确定要理解答案的第二部分,OP提到需要从子类中调用super。所以发生同样的问题。 – AxelH

+0

@AxelH是的,谢谢你,他要求继承'Player'的类。我知道了。我将更新 – Blasanka

+0

@AxelH现在就是它。再次感谢提及。 – Blasanka

相关问题