2013-10-11 8 views
9

Ich versuche einen Konstruktor zu erstellen, der ein Feld als Parameter akzeptiert und dann in ein Feld schreibt, das in einer Oberklasse gespeichert ist. Hier ist der Code, den ichAufruf der Oberklasse aus einem Unterklassenkonstruktor in Java

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

In der übergeordneten Klasse verwende ich das Feld initialisiert haben mit

private String flavour; 

und ich habe eine Accessormethode

public String getFlavour() { 
    return flavour; 
} 

Ich erhalte eine Fehlermeldung "Geschmack hat privaten Zugang in der Oberklasse ", aber ich glaube, das sollte nicht wichtig sein, da ich die Accessor-Methode, die es an das Feld zurückgibt aufrufen?

+0

Euh, was Sie haben, sollte gut funktionieren. Sind Sie sicher, dass Sie uns den wahren Code zeigen? –

+1

Bitte senden Sie eine [SSCCE] (http://sscce.org), um Ihr Problem zu replizieren. –

+0

Wird 'title' in' Chips' oder in der Elternklasse deklariert? –

Antwort

15

Was sollten Sie tun:

einen Konstruktor Ihre Super-Klasse hinzufügen:

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

In der Crisps Klasse:

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

 

Co mments

Einige Kommentare zu Ihrer Frage:

private String flavour; 

„In der übergeordneten Klasse habe ich das Feld mit initialisiert“ Dies ist keine Initialisierung, ist es eine Erklärung. Eine Initialisierung ist, wenn Sie einen Wert festlegen.

"Ich bekomme einen Fehler" Geschmack hat privaten Zugriff in der Oberklasse "aber ich glaube, das sollte nicht wichtig sein, da ich die Accessor-Methode aufrufen, die es an das Feld zurückgibt?"

Wenn Sie einen Accessor (Getter) aufrufen, ist es in Ordnung - hängt von der Getter Sichtbarkeit. Das Problem in Ihr Code ist:

this.flavour = 

weil Geschmack kein Feld auf Crisps Klasse deklariert ist, aber auf dem Abendessen Klasse, so dass Sie nicht über einen direkten Zugang wie das tun können.

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

Dann können Sie es auf das Kind Klasse verwenden:

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

@ ipinto.eu Während Ihre Antwort richtig ist und Ihre Lösung, Ihre letzte alternative Lösung in Ihrer Antwort (unter Verwendung von Sätzen der Oberklasse) verletzt die Regel der Vererbung, nehme ich an, da es die "Overridable Methodenaufruf in Konstruktor geben würde ] (https://stackoverflow.com/questions/3404301/whats-wrong-with-overridable-method-calls-in-constructors) "Problem. Daher ist Ihre letzte Alternativlösung keine wirkliche Lösung, sondern bringt Fehler in den Code. Ich denke, * super.setFlavour (Geschmack) * sollte funktionieren. –

+0

Ich verstehe und stimme zu; Ich muss sagen, das Beispiel diente der Diskussion. Ich mag Ihren Vorschlag, es mit Super, Andere Optionen (und andere Philosophie) zu nennen, um Ihre Setter final zu machen (nicht möglich zu überschreiben). –

1

flavour ist privat. Obwohl Sie es von der public-Methode lesen, weisen Sie es einem privaten Feld zu und haben es wahrscheinlich nicht in dieser Klasse deklariert.

Sie könnten Geschmack protected in der übergeordneten Klasse setzen oder einen Setter definieren dafür

Letztlich Ihr Code nicht wirklich Sinn allerdings macht. Selbst wenn es kompilieren würde, wäre es mehr oder weniger: flavour = flavour. Vielleicht sollten Sie überdenken, was Sie versuchen, ein wenig zu tun

Ich denke, dass Sie eine engere Erfassung von Java und Objektorientierte Programmierung benötigen.

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

sollten Sie hier beginnen.

+0

OK gesagt haben, gibt es sowieso, es durch Aufrufe der öffentlichen Methode getFlavour zu tun? – user215732

+0

@ user215732 'getFlavour' macht genau das. Es bekommt 'Geschmack'. Sie können dies nicht verwenden, um dem Geschmack einen Wert zuzuweisen. Wenn ein veränderliches Objekt zurückgegeben wird, können Sie den tatsächlichen Geschmack ändern, aber in diesem Fall sind die Strings unveränderlich. – Cruncher

+1

@ user215732 Ihr 'Chips' Konstruktor hat einen Parameter' Geschmack' aber Sie tun nichts damit, da Ihr Code gerade geschrieben wird. – ajb

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

Dies sollte funktionieren wie see Docs

Sie sollten mein Vorschlag oder deklarieren einen Setter auf der Superklasse verwenden
1

Marke

private String flavour; 

public, andernfalls haben Ihre Unterklassen keinen Zugriff auf diese Zeichenfolge. Ihre Oberklasse weiß nichts über die Existenz irgendeiner Unterklasse. Gemäß der Java-Dokumentation stellt "privat" jede Variable und Methode in dieser Klasse zur Verfügung, in der private Variablen oder Methoden deklariert wurden, und keine Klasse hat Zugriff darauf, auch keine Unterklassen. Sobald Sie Ihren Zugriffsmodifizierer ändern, werden keine Fehler mehr angezeigt.

Verwandte Themen