Klassenvariablen und Klassenmethoden

Cerberus81

Mitglied
Hallo zusammen. Ich sitze hier an einer Praktikumsaufgabe für morgen, und bin generell eigentlich schon recht weit, habe aber gerade wieder einmal ein Verständnisproblem.

Bis hierhin bin ich jetzt gekommen:

Wir definieren nun die Klasse Kreis analog zu der Klasse Rechteck aus dem letzten Termin.
Die maximalen Werte für die Größe, Position und die Farbe sollen nun in Konstanten gespeichert werden.

a) Definieren sie einige geeignete Eigenschaften eines Kreises,
d.h. mit Daten, die z.B. Position, Radius und Farbe eines Kreises beschreiben
Diese Eigenschaften sollen außerhalb der Klasse nicht sichtbar sein.

b) Definieren Sie Konstanten für maximal erlaubte Werte der Eigenschaften als Klassenvariablen (CV). Verwenden Sie sinnvolle Namen!

c) Testen Sie in der Klasse Kreis in der CM main() und einer IM test() den Zugriff auf diese CV.

1. Als Eigenschaften der Klasse.
2. Ohne Angabe der Klasse.
3. Versuchen Sie, den Wert der Konstanten zu ändern.

d) Testen Sie in der Klasse Test in der CM main() und einer IM test() den Zugriff auf die Instanzvariablen eines Kreises.

1. Als Eigenschaften der Klasse.
2. Ohne Angabe der Klasse.
3. Versuchen Sie, den Wert der Konstanten zu ändern.

Mein Code dazu sieht folgendermaßen aus:

Java:
class Kreis {

    private final double position = 6.0;                // Definieren der
    private final int radius = 45;                      // Instanzvariablen
    private final String farbe = "Gelb";


        public static final double position1 = 6.0;     // Definieren der
        public static final int radius1 = 45;           // Klassenvariablen
        public static final String farbe1 = "Gelb";


    void test() {                                       // Instanzmethode


        System.out.println("Position = " + Kreis.position1);
        System.out.println("Radius = " + Kreis.radius1);
        System.out.println("Farbe = " + Kreis.farbe1);
        //position1 = 5.5; <-- ist nicht moeglich (Konstante)

        System.out.println("Position = " + position);
        //System.out.println("Position = " + Kreis.position); <-- nicht moeglich
        //position = 5.5; <-- nicht moeglich (Konstante)

                //System.out.println(this.position1);
    }

public static void main(String args[]) {                // Main Methode

                                                            
    System.out.println("Position = " + Kreis.position1);    
    System.out.println("Radius = " + Kreis.radius1);
    System.out.println("Farbe = " + Kreis.farbe1);
    //position1 = 5.5; <-- Ist nicht moeglich (Konstante)

    //System.out.println("Position = " + Kreis.position); <-- nicht möglich
    //System.out.println("Position = "+ position); <-- nicht möglich
    //position = 5.5; <-- nicht moeglich (nicht statisch + Konstante)
}

   }

Nun kommt Aufgabe 1 e) + 1f):

Definieren Sie einige geeignete Methoden zum Setzen der Eigenschaften eines Kreises. Dabei sollten die Werte die maximal erlaubten Werte nicht überschreiten.
Dabei greifen Sie auf die Instanz‐ bzw. Klassenvariablen verschieden zu. Versuchen Sie jeweils, d.h. sowohl für die IV als auch für die CV:
‐ Mit und ohne Angabe der Klasse
‐ Mit und ohne Angabe von this

f) Definieren Sie auch eine IM, die die Werte des Kreises auf die Konsole ausgibt.

Definieren Sie eine Klassenmethode (CM), in der Sie testen, ob Sie auf CV und/oder IV zugreifen können. Versuchen Sie jeweils auf die IV als auch auf die CV zuzugreifen:

Mit und ohne Angabe der Klasse

Mit und ohne Angabe von this

Bislang ist also kein Constructor, sondern nur Methoden gefragt.

Nun gehe ich also davon aus, dass ich zu jeder der drei von mir festgelegten Eigenschaften jeweils eine Set und eine Get Methode definieren muss.
Allerdings tue ich mich gerade schwer damit, wie ich die nun anlegen muss, damit sie sowohl auf die CV als auch auf die IV so zugreifen können, dass die Werte gesetzt werden, und ich weiß außerdem nicht, wie man Instanzmethoden außerhalb der Mainmethode auf die Konsole ausgeben kann.

Hat jemand vielleicht einen Denkanstoß für mich?
 

javimka

Top Contributor
Java:
// Getter
public double getPosition() {
  return position;
}

// Setter
public void setPostion(double d) {
  position = d;
}
Weil deine Attribute aber final sind, wirst du keine Setter-Methoden machen können. Entfertne entweder das final oder mach keine Setter.
 

Cerberus81

Mitglied
Ja, genau das ist auch mein Problem. In der Vorlesung haben wir final gerade erst durchgenommen, und da sich die Aufgaben immer auf die letzte Vorlesung stützen, gehe ich eigentlich davon aus, dass die Eigenschaften auch als Konstanten gesetzt werden müssen (steht ja so auch in der Aufgabe). Deshalb bin ich ja so ratlos, wie es jetzt mit d) und f) weitergehen soll.
 

javimka

Top Contributor
Ja, aber das Wort "versuchen" impliziert doch bereits, dass du scheitern musst. Sonst würde es ja heissen: "Ändern Sie die Konstanten."
 

Final_Striker

Top Contributor
ja, die maxWert Konstanten zu ändern. ;-)

bei der d) musst du dann z.b so was machen.

Java:
public void setRadius(int radius)
{
   if(radius <= MAX_RADIUS)
      this.radius = radius;
   else
      this.radius = MAX_RADIUS;
}
 

Cerberus81

Mitglied
Ja, vielen Dank. Jetzt habe ich es verstanden.
Ich bin bei der Aufgabenstellung davon ausgegangen, dass alles aufeinander aufbaut, und man an den ursprünglichen Definitionen nichts mehr ändert. Aber anscheinend muss hier bei jedem Unterpunkt variiert werden.
Danke für eure Hilfe!

Was ich allerdings gerne noch wüsste: Wie kann ich dem Setter konkrete Werte zuweisen, und diese dann auch auf der Konsole ausgeben?
 

javimka

Top Contributor
Konkrete übergibst du mittels Argument: z.B. [c]setPosition(20);[/c]
Mit System.out.println() kannst du jederzeit von überall her Texte auf der Konsole ausgeben. Also auch im Setter.
 

Cerberus81

Mitglied
Für die Position habe ich das jetzt so geschrieben:

Java:
class Kreis {

    private static double position ;                // Definieren der
    private static int radius = 45;                      // Instanzvariablen
    private static String farbe = "Gelb";


        public static double position1 = 6.0;     // Definieren der
        public static final int radius1 = 45;           // Klassenvariablen
        public static final String farbe1 = "Gelb";

        public void setPosition(double d) {  // Setter
            d = 2.0;
            position = d;

Aber per System.out.Print kann ich sie in der Main Methode nicht ausgeben, bzw, sie steht dann auf 0.0
 

javimka

Top Contributor
Schreib Mal: [c]System.out.println("position: "+position);[/c]
Wenn dann steht "position: 0.0", heisst das nichts anderes, als dass 0.0 auf position gespeichert ist.

Wieso hast du deine Variabeln static gemacht? Das ist nicht mehr so Objekt-Orientiert wie vorher.
 

Final_Striker

Top Contributor
Java:
class Kreis {

    private  double position ;             
    private  int radius;                     
    private  String farbe;

    public static double MAX_POSITION = 6.0;     
    public static final int MAX_RADIUS = 45;           
    public static final String MAX_FARBE = "Gelb";  // String macht keinen Sinn, besser wäre ein RGB oder Grauwert

    public void setPosition(double d) {  // Setter
          if(d <= MAX_POSITION)
              this.position = d;
          else
              this.position = MAX_POSITION;
    }

    public double getPosition()
    {
         return position;
    }

     // weiter Getter und Setter...
}

mit getPosition() bekommst du nun in deiner TestKlasse den Wert für Position.

static habe ich sie gemacht, damit sie auch über die Main Methode aufgerufen werden können. Ist das keine so gute Idee gewesen?

damit macht du sie aber zu Klassenvariablen
 
Zuletzt bearbeitet:

javimka

Top Contributor
Das Problem ist, dass du nicht mehr verschiedene Kreise instanzieren kannst. Wenn sie nicht statisch sind und du instanzierst einige Kreise, dann hat jeder Kreis eine eigene Position, Radius usw. Nun wo die Variabeln static sind, ist der Wert für alle Kreise gleich.
Nimm das static wieder raus. Wenn du dann einen Kreis kreis = new Kreis() instanzierst, kannst du mit kreis.position usw. auf die Variabeln zugreifen.
 

Cerberus81

Mitglied
Ja, das macht Sinn, ist mir auch gerade aufgefallen. Ich habe das static bei den ersten drei Eigenschaften wieder heraus genommen.

Puh ... ich kann euch beiden gar nicht genug für eure Geduld mit mir danken. Ich bin halt noch ein blutiger Anfänger.
 

Cerberus81

Mitglied
Also, ich habe jetzt mal ein neues Projekt und ein neues File angelegt, damit es nicht zu unübersichtlich wird:


Java:
    public class Kreisb {
   
    private double position ;                           // IV
    private int radius;
    private String farbe;

    public static final double MAX_POSITION = 6.0;      // CV
    public static final int MAX_RADIUS = 45;
    public static final String farbe1 = "Gelb";

    public void setPosition(double d) {     // Setter - IM

        d = 2.0;

        if(d <= MAX_POSITION)
              this.position = d;
          else
              this.position = MAX_POSITION;
    }

        public double getPosition() {

            return this.position;
        }

    public static void main(String args[]) {

        System.out.println("Position = " + MAX_POSITION);

    }

    }

Wie bekomme ich es nun hin, den Wert von 2.0 auf die Konsole auszugeben? So, wie es hier steht, kommt nämlich wieder 6.0 heraus.
 

javimka

Top Contributor
In Zeile 7 schreibst du [c]MAX_POSITION = 6.0[/c] und genau das printest du dann. Natürlich kommt da 6.0 raus.

Ich glaube du willst eigentlich folgendes:
Java:
public static void main(String[] args) {
  Kreis kreis = new Kreis();
  kreis.setPosition(2.0);
  System.out.println("Kreis Position: "+kreis.getPosition());
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
KogoroMori21 Objektvariablen, Klassenvariablen, Instanzvariablen Java Basics - Anfänger-Themen 1
D Richtige Kommentierung Klassenvariablen Java Basics - Anfänger-Themen 19
Z private Klassenvariablen Java Basics - Anfänger-Themen 8
N Klassenvariablen zurücksetzen Java Basics - Anfänger-Themen 4
G Klassenvariablen & Instanzvariablen Java Basics - Anfänger-Themen 4
J Variablen Unterschied zwischen lokalen-, Instanz-, Klassenvariablen Java Basics - Anfänger-Themen 6
N Vererbung Best Practice: Verfeinerte Klassenvariablen in Unterklasse Java Basics - Anfänger-Themen 5
D Klassenvariablen standardmäßig private oder public? Java Basics - Anfänger-Themen 2
S Initialisierung von Klassenvariablen Java Basics - Anfänger-Themen 7
A Klassenvariablen zusammen fassen Java Basics - Anfänger-Themen 5
G Frage zu Fields - Klassenvariablen Java Basics - Anfänger-Themen 9
A Klassenvariablen Referenz auf ein Objekt Java Basics - Anfänger-Themen 18
M Variablen Gültigkeit von Klassenvariablen bei Vererbung? Java Basics - Anfänger-Themen 4
J Klassenvariablen lesen Java Basics - Anfänger-Themen 13
B Datentypen Klassenvariablen Java Basics - Anfänger-Themen 2
G OOP Verständisfrage zu Klassenvariablen Java Basics - Anfänger-Themen 5
J Problem mit inneren Klassen und Klassenvariablen Java Basics - Anfänger-Themen 11
G Sollte man Klassenvariablen als final deklarieren? Java Basics - Anfänger-Themen 3
X Zugriff auf Klassenvariablen NUR mit get/set Methoden? Java Basics - Anfänger-Themen 8
W Klassenvariablen und Werte ausgeben Java Basics - Anfänger-Themen 2
D Globale Klassenvariablen. Java Basics - Anfänger-Themen 12
7 Lokale Variablen, Klassenvariablen, Instanzvariablen Java Basics - Anfänger-Themen 15
H Klassenvariablen,methoden Java Basics - Anfänger-Themen 7
M Zugriff auf Klassenvariablen Java Basics - Anfänger-Themen 8
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
K Klassenmethoden Java Basics - Anfänger-Themen 23
B Methoden Nutzen der Instanzvariablen in Klassenmethoden Java Basics - Anfänger-Themen 1
V Klassenmethoden static Java Basics - Anfänger-Themen 2
F NullPointerException bei Klassenmethoden Aufruf Java Basics - Anfänger-Themen 4
nadoria statische Methoden (Klassenmethoden) Java Basics - Anfänger-Themen 3
S Klassenmethoden ansprechen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben