2017-10-05 147 views
-2

我有一个带有构造函数“A”的抽象类,想用super()的子类的构造函数“B”来使用它。但是,我不得不使用“B”超()在第一行:如果我创建这个“B” -constructor岁用super构造函数初始化()

public class B extends A { 

    // constructor B 
    public B(String name){ 
     // cannot have this on the first line 
     int age = 18; 
     // constructor "A" of abstract class 
     super(name, age); 
    } 

} 

如何传递的超级构造函数的年龄?

+0

你能更具体吗? –

+0

“如果我在这个”B“ - 构造函数中创建年龄”为什么你没有将它作为参数传递给B()。如果它固定为所有的obj为什么不是静态类字段? – VedX

+0

'super(name,age)'应该是构造函数中的第一条指令 –

回答

2

super必须始终在派生类的构造函数的第一个语句。

你基本上有两种选择:

a)设置你的age直接super调用内部:

public B(String name){ 
    super(name, 18); 
} 

您还可以进行其他(简单)的计算或调用(静态)方法一致。

b)利用一个静态工厂方法:

public static B create(String name) { 
    int age = 18; 
    return new B(name, age); 
} 

private B(String name, int age){ 
    super(name, age); 
} 

这种方法提供了更多的自由(因为你现在可以在调用B的构造函数)之前写的语句,但如果B是抽象为不工作好。

而不是调用B的构造函数(new B("myName")),然后您可以调用静态的create方法(B.create("myName"))。

+0

完美。我不能使用内联的解决方案a)(因为在调用super()构造函数之前必须进行一些计算,但b)的解决方案是完美的。谢谢! – nimo23

1

您可以内嵌代码这样的构造函数中:

public B(String name) { 
    super(name, 18); 
}