2013-10-11 146 views
9

我想创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。下面是我使用从Java中的子类构造函数调用超类

public crisps(String flavour, int quantity) { 
    this.flavour = super.getFlavour(); 
    this.quantity = quantity; 
} 

在超我已经初始化现场与

private String flavour; 

的代码,我有一个访问方法

public String getFlavour() { 
    return flavour; 
} 

我得到一个错误“味道在超类私人访问“,但我相信这应该不重要,因为我调用访问器方法,它返回到字段?

+0

恩,你有什么应该可以正常工作。你确定你向我们展示真实的代码吗? –

+1

请发布[SSCCE](http://sscce.org)以复制您的问题。 –

+0

在'薯片'中还是在父类中声明'title'? –

回答

15

你应该做的:

添加一个构造函数,以您的超类:

public Superclass { 
    public SuperClass(String flavour) { 
     // super class constructor 
     this.flavour = flavour; 
    } 
} 

在薯片类:

public Crisps(String flavour, int quantity) { 
    super(flavour); // send flavour to the super class constructor 
    this.quantity = quantity; 
} 

 

有限公司mments

一些评论你的问题:

“在超我已经初始化现场与”

private String flavour; 

这不是一个初始化,这是一个宣言。初始化是当你设置一个值。

“我得到一个错误”味道在超类中有私人访问“,但我相信这应该无关紧要,因为我调用访问器方法将它返回给字段?

当您调用访问器(又名getter)时,它可以 - 取决于getter的可见性。 在你的代码的问题是:

this.flavour = 

,因为味道是不是薯片类声明的字段,但在晚饭类,所以你不能做这样的直接访问。你应该用我的建议还是在超类声明一个二传手:

public void setFlavour(String flavour) { 
    this.flavour = flavour; 
} 

然后你可以使用它的子类:

public Crisps(String flavour, int quantity) { 
    this.quantity = quantity; 
    setFlavour(flavour); 
} 
+0

@ ipinto.eu虽然你的答案是正确的,你的解决方案也是如此,但你的答案中的最后一个替代解决方案(使用超类的setter)违反了继承规则,我想,它会给出“[Overridable method call in constructor ](https://stackoverflow.com/questions/3404301/whats-wrong-with-overridable-method-calls-in-constructors)“的问题。因此,你最后的替代解决方案不是一个真正的解决方案,但会在代码中带来错误。我认为,* super.setFlavour(flavor)*应该起作用。 –

+0

我理解并同意;我必须说,这个例子是为了讨论。我喜欢你用超级调用它的建议,其他选项(和不同的理念)是让你的制定者最终(不可能覆盖)。 –

1

flavour是私密的。虽然你从公开方法阅读它,但是你将它分配给一个私人领域,并且你可能没有在这个类中声明它。

您可以设置味道protected父类或定义setter它

最终你的代码并没有真正意义虽然。即使它编译了,也会更多或更少:flavour = flavour。也许你应该重新考虑你正在试图做的一点点

我想你可能需要Java的更严格的把握和面向对象编程的东西。

http://docs.oracle.com/javase/tutorial/java/concepts/

你应该从这里开始。

+0

好吧,是否有通过调用公共方法getFlavour来做到这一点? – user215732

+0

@ user215732'getFlavour'就是这么做的。它得到'flavour'。你不能用它来为味道赋值。如果它返回一个可变对象,那么你可以修改实际的风格,但在这种情况下,字符串是不可变的。 – Cruncher

+1

@ user215732你的'crisps'构造函数有一个参数'flavour',但是你没有做任何事情,因为你的代码正在编写。 – ajb

1
public crisps(String flavour, int quantity) 
{ 
    super(flavour); 
    this.quantity = quantity; 
} 

这应该为see Docs

1

品牌

private String flavour; 

public,否则你的子类将无法访问此String。 你的超类不知道任何子类的存在。根据Java文档,“private”使得该类中的任何变量和方法都可用,其中声明了私有变量或方法,但没有任何类可以访问它,甚至是子类。 一旦您有机会使用您的访问修饰符,您将不会收到任何错误。

相关问题