Fehler beim Aufrufen von Instanzvariablen

Status
Nicht offen für weitere Antworten.

Data

Mitglied
Hallo,

meine Subklasse kann die private Instanzvariablen der Superklasse trotz get-Methoden nicht aufrufen. Hab's schon mit einer einzelnen get-Methode probiert, die alle drei Variablen ausgibt, klappt aber auch nicht. Der Compiler meldet ab Zeile 23 der Subklasse "day has private access in time". Irgendwo scheine ich einen ziemlichen Denkfehler drinzuhaben...

Code:
public class Time implements Comparable {
    private int
      hour,          // 0 .. 23
      day,           // 1 .. 31
      month;         // 1 .. 12

    // allgemeiner Konstruktor
    // Falls die Wertebereiche für die Attribute nicht eingehalten werden,
    // wird eine IllegalArgumentException ausgeworfen.
    public Time(int hour, int day, int month) {
      if (hour > 23 || hour < 0 || day > 31 || day < 0 || month > 12 || month < 0)
        throw new IllegalArgumentException("ungültige Eingabe!");
      this.hour = hour;
      this.day = day;
      this.month = month;
    }
 
    // Standardkonstruktor
    // Datum und Uhrzeit werden auf den 01.01., 00:00 Uhr eingestellt
    public Time() {
      hour = 0;
      day = 1;
      month = 1;
    }

    // die Zeit einstellen
    // Falls die Wertebereiche für die Attribute nicht eingehalten werden,
    // wird eine IllegalArgumentException ausgeworfen.
    public void set(int hour, int day, int month) {
     if (hour > 23 || hour < 0 || day > 31 || day < 0 || month > 12 || month < 0)
       throw new IllegalArgumentException("ungültige Eingabe!");
    }

    // liefert eine Zeichenkette, welche die Attributwerte enthält
    public String toString() {
      return "Datum: " + day + "." + month + "." + "Stunde" + hour + ":00";
    }
 
    //get-Methode
    public int getDay() {
      return day;
    }

    public int getMonth() {
      return month;
    }

    public int gethour() {
      return hour;
    }

    // zur Implementierung der Schnittstelle java.lang.Comparable
    // vergleicht das aktuelle Time-Objekt mit dem übergebenen Objekt o
    // liefert einen Wert < 0, wenn das aktuelle Objekt kleiner als t ist
    //                    > 0, wenn das aktuelle Objekt größer als t ist
    //                      0, wenn das aktuelle Objekt gleich t ist
    // Laufzeitfehler, falls o nicht vom Typ Time ist
    public int compareTo(Object o) {
      int month2 = ((Time)o).month;
      int day2 = ((Time)o).day;
      int hour2 = ((Time)o).hour;
      //Fall1
      if (month2 < month)
        return -1;
      //Fall2
      if (month2 > month)  
        return 1;   
      //Fall3
      if (month2 == month && day2 < day)
        return -1;
      //Fall4
      if (month2 == month && day2 > day)
        return 1;
      //Fall5
      if (month2 == month && day2 == day && hour2 < hour)
        return -1;
      //Fall6
      if (month2 == month && day2 == day && hour2 > hour)
        return 1;
      //Fall7
      return 0;
    }

    // vergleicht das aktuelle Time-Objekt mit dem übergebenen Objekt o
    // liefert true, wenn das aktuelle Time-Objekt gleich o ist, sonst false
    // Laufzeitfehler, falls o nicht vom Typ Time ist
    public boolean equals(Object o) {
      if (o == null)
        return false;
      if (this.month == ((Time)o).month && this.day == ((Time)o).day 
                                      && this.hour == ((Time)o).hour)
        return true;
      return true;
    }
}

Subklasse:
Code:
class Event extends Time
{
    private String text;

    // allgemeiner Konstruktor
    public Event(int hour, int day, int month, String text) {
      super(hour, day, month);
      this.text = text;
    }

    // Standardkonstruktor
    public Event() {
      super();
    }

    // einen Termin festlegen
    public void set(int h, int d, int m, String s) {
    }

    // liefert eine Zeichenkette, welche die Attributwerte enthält
    public String toString() {
      return "Datum: " + day + "." + month + "." + "Stunde" + hour + 
                    ":00" + "Text: " + text;
    }


    // zwei Termine sind gleich, wenn sowohl Zeit als auch Text übereinstimmen
    // liefert true, wenn das aktuelle Event-Objekt gleich o ist, sonst false
    // Laufzeitfehler, falls o nicht vom Typ Event ist
    public boolean equals(Object o) {
      if (o == null)
        return false;
      if (this.month == ((Time)o).month && this.day == ((Time)o).day
                         && this.hour == ((Time)o).hour && text.equals((Time)o).text))
        return true;
      return true;
    }

}
 
Wozu schriebst du dir get-Methoden, wenn du sie dann nicht benutzt?

Ersetze in Event day durch #getDay und den Rest analog dazu und gut iss.
 
Du hast zwar einen getter, aber du benutzt ihn nicht 😀
Code:
      return "Datum: " + getDay() + "." + getMonth() + "." + "Stunde" + getHour +
                    ":00" + "Text: " + getText();
Alternativ kannst du dir auch überlegen ob es sinnvoll ist die entsprechenden Atribute protected zu setzen.

EDIT: 2late
 
Danke! Klassischer Fall von Brett vorm Kopp!

Ein kleines PRoblem bleibt leider noch. Ich komme mit der folgenden Fehlermeldung für Zeile 35 nicht weiter: Der Compiler meldet "boolean cannot be dereferenced && this.getHour() == ((Time)o).getHour() && text.equals((Time)o).text)
1 error"

Was will er mir damit sagen?

Code:
class Event extends Time
{
    private String text;

    // allgemeiner Konstruktor
    public Event(int hour, int day, int month, String text) {
      super(hour, day, month);
      this.text = text;
    }

    // Standardkonstruktor
    public Event() {
      super();
    }

    // einen Termin festlegen
    public void set(int h, int d, int m, String s) {
    }

    // liefert eine Zeichenkette, welche die Attributwerte enthält
    public String toString() {
      return "Datum: " + getDay() + "." + getMonth() + "." + "Stunde" + getHour() + 
                    ":00" + "Text: " + text;
    }


    // zwei Termine sind gleich, wenn sowohl Zeit als auch Text übereinstimmen
    // liefert true, wenn das aktuelle Event-Objekt gleich o ist, sonst false
    // Laufzeitfehler, falls o nicht vom Typ Event ist
    public boolean equals(Object o) {
      if (o == null)
        return false;
      if (this.getMonth() == ((Time)o).getMonth() && this.getDay() == ((Time)o).getDay()
                && this.getHour() == ((Time)o).getHour() && text.equals((Time)o).text)
        return true;
      return true;
    }
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben