Warum wird bei Java die Variable "doppelt" eingeführt?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

dogsAge gibt es nur innerhalb von Dog().
age = dogsAge bewirkt, dass das Alter im Objekt gespeichert wird und später darauf zugegriffen werden kann.

Was mich allerdings irritiert ist, dass age nicht bereits bei Animal deklariert wurde, denn jedes Tier hat ein Alter.

Danke! Ich glaube ich habe es verstanden!
Das Beispiel ist ein bisschen unglücklich denn die Klasse Animal existiert zu dem Zeitpunkt an dem ich das Beispiel rauskopiert habe noch nicht :D Man fängt mit der dog Klasse an und fügt dann die Animalklasse hinzu und schafft die Attribute die nicht Hundespezifisch sind dann erst rüber :D

2
@Docenock

Achso, gut, das wusste ich nicht. Im Rahmen dieser Lehrbeispiele ist ja fast alles erlaubt.

3

Ich würde, wenn ich auf Variablen des Objekts zugreife, grundsätzlich immer das Schlüsselwort "this" verwenden. Dann können lokale Variablen und Objektvariablen auch den gleichen Namen haben. Über "this" wird dann jeweils die Objektvariable angesprochen. Ansonsten "verdecken" lokale Variablen die Objektvariablen (shadowing).

Außerdem würde ich die Variable als "private" deklarieren. Außerdem könnte man sie hier, da sie nur im Konstruktor gesetzt wird und ansonsten nie wieder schreibend auf sie zugegriffen wird, sogar als "final" deklarieren.

class Dog extends Animal {
private final int age;

public Dog(int age) {
this.age = age;
}

public int getAge() {
return this.age;
}

}

Sobald Du Code hast, der das Alter verändert (das Alter verändert sich ja schon dadurch, dass Zeit verstreicht), musst Du das "final" entfernen.

Das Schlüsselwort "this" gibt Dir eine Referenz auf das aktuelle Objekt (auf das die Methode aufgerufen wurde). Lokale Variablen gleichen Namens "verdecken" Objektvariablen (shadowing).

Ich empfinde das "this" auch so (wenn kein shadowing stattfindet), als "guten Stil", sozusagen um noch einmal explizit hinzuschreiben, dass ich hier auf eine Objektvariable zugreife.

Wenn es nach mir ginge, könnte die Sprache den Zugriff auf Objektvariablen und Methoden ohne das Schlüsselwort "this" (oder allgemein eine Objektreferenz) verbieten. Leider ist dem aber nicht so. Ich programmiere trotzdem so, als wäre dem so. Empfinde ich als "guten Stil". Man muss nicht alles machen, was die Sprache einem erlaubt. Wenn man eine bestimmte Sache "expliziter" tun kann, als von der Sprache gefordert, ist es oft auch gut, dies zu tun, weil man damit aktiv dokumentiert, dass man wirklich genau dies möchte (z. B. eben auf das Objekt zugreifen).

Die Antwort ist in der Summe sehr ausführlich, mit ein paar mehr Details noch die ich nicht erwähnte. 

das mit dem Shadowing sehe ich prinzipiell ja schon ein. und age hier doppelt zu verwenden ebenso. Allerdings this an allen möglichen Stellen zu verwenden leuchtet mir jedoch nicht so ganz ein. - Bei Instanz-Variablen finde ich es bei der Leserlichkeit zwar auch besser, jedoch stünde diese Option dann auch noch für Methoden zu Verfügung - und da würde ich bei Methodenaufrufen eher auf ein this verzichten.

1
@KnusperPudding

Das stimmt. Bei Methoden gibt es im Prinzip keine Doppeldeutigkeit, daher wäre das "this" redundant. Aber es dient der Konsistenz. Wenn Du auf einem "fremden" Objekt eine Methode aufrufst, schreibst Du "objektreferenz.methode(...)". Für den Spezialfall, dass Du die Methode "auf Dir selbst" aufrufst, ist die Objektreferenz eben das Schlüsselwort "this".

Es bringt aber nichts, sich darüber zu streiten, deswegen werde ich das an dieser Stelle auch nicht tun. ;-)

Syntaktisch ist beides korrekt, das heißt dem Rechner ist es "egal". Es ist gewissermaßen persönliche Präferenz. Dereferenzieren muss die JVM bei Methodenaufrufen ohnehin, das heißt das "this." bewirkt keine zusätzliche Dereferenzierungsoperation, die Laufzeit kostet (auch wenn es zunächst so aussehen mag).

1
@NoHumanBeing

Mir ginge es nicht ums 'Streiten', nur manchmal verstehe ich andere 'Ansichten' nicht, bin aber froh wenn ich noch dazu lernen kann.

1
@KnusperPudding

Hatte es auch nicht als "Streit" interpretiert. Ich wollte nur sagen, ich werde jetzt nicht in eine Diskussion ausarten, ob man es so oder so machen sollte, denn es wird sehr wahrscheinlich darauf hinauslaufen, dass wir beide es weiterhin so machen werden, wie wir es bisher für richtig hielten und das ist ja auch in Ordnung so. ;-)

1

Genau das ist der Punkt den du lernen sollst über objektorientiere Programmierung. Da finde ich C# besser, da man da Eigenschaften einer Klasse direkt speichern und ansprechen kann.

Bei Java werden klasseninterne Eigenschaften als 'private' deklariert und dann über getter- und setter-Funktionen angesprochen.

Die set-Funktion musst du dir Vorstellen wie ein Befehl, den du an den Hund gibst. Du sagst dem Hund also "du bist jetzt soviele jahre alt". Das "soviele" entspricht also deinem "dogsAge". Mit dieser Information setzt der Hund intern sein Alter.

Warum macht man das so und nicht anders? Nun...es gibt Situationen, da muss man etwas mehr machen als nur das Setzen. Oder es wird intern noch in Tage umgerechnet und nach aussen immer in Jahre. oder oder oder. Auf Klasseninterne Variablen sollte man direkt niemals zugreifen dürfen (rechte). Daher das bitte immer über getter- und setter-Funktionen kapseln

Ich hoffe ich konnte dir helfen

Gruß
Omni

Char zu int?

Hallo Leute, ich habe eine Aufgabe, könnt ihr mir helfen. Und etwas dazu erklären bitte. Danke für eure Hilfe.

Erstellen Sie ein Programm welches folgende Schritte abarbeitet:

• Deklaration und Initialisierung einer Variable vom Typ char mit dem Wert F.

• Deklaration und Initialisierung einer Variable vom Typ int mit dem Wert 13.

• Deklarieren Sie eine weitere int Variable mit Namen Summe und weisen Sie ihr die Summe der beiden bereits erstellten Variablen zu.

• Geben Sie den Wert der Variable Summe auf der Kommandozeile aus.

Erklären Sie, wie der Wert des Ergebnisses zu Stande kommt.

Achten Sie auf eine gute Code Formatierung. Achten Sie auch darauf, das Ihr Name in der Datei als Kommentar vorhanden ist.

Beispiel:

// Max Mustermann

// 552348

public class Primzahl { } 

...zur Frage

Java integer Variable soll sich +1 addieren

Hallo. Wie kann ich eine Integer Variable mit sich selbst mit 1 addieren?? Ich will, dass mein Knopf eine 0 anzeigt, welche beim Klicken zu einer 1 wird, beim zweiten klicken zu einer 2, beim dritten zu einer 3 usw usw usw.

Das hier ist meine Variablen-class und bei Zeile 3 kommt der Fehler, dass die Variable doppelt da ist. Genau so geht das aber in Python Batch usw. Es muss also auch in Java gehen.

public final class Variablen{
         public static int nummer(){
          int x = x+1;
         return x;
        } 
}

Hoffentlich kann mir wer helfen. PS: Die Variable wird aus einer anderen Class abgerufen mit folgendem Text:

package de.Leon.java;

import javax.swing.*;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Fenster extends JFrame

    implements ActionListener{
    
    private JButton  Knobb = new JButton("Drücken");
    private JButton DesIsAuchEnKnobb = new JButton("Zahlen");
    
    public Fenster(){
        
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    Knobb.addActionListener(this);
    DesIsAuchEnKnobb.addActionListener(this);
    
    getContentPane().add(Knobb);
    getContentPane().add(DesIsAuchEnKnobb, BorderLayout.SOUTH);
    
    pack();
    
    setLocationRelativeTo(null);
    
    setVisible(true);
    
    }

    public static void main(String[] args) {
        new Fenster();
    }
    

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==Knobb){
            Knobb.setText("Gedrückt");
        }
        if (e.getSource()==DesIsAuchEnKnobb) {
            DesIsAuchEnKnobb.setText("" + Variablen.nummer());
        }
    }
    
}

Ich bin noch am Java lernen und kann also nicht sonderlich viel^^

Ich benutze Eclipse

...zur Frage

Java Spiel Fehler im Code?

Hallo,

Ich muss für die Schule in Java ein Code für ein Spiel schreiben. Hierbei habe ich mich für "Schere, Stein, Papier" mit 5 Varianten entschieden.

Für den Code habe ich lange gebraucht doch als ich endlich fertig war und ihn ausprobiert habe, habe ich keine Fehlermeldung bekommen - sprich der Code enthält 'in Java Sprache' keine Fehler.

Doch das Spiel funktioniert nicht!

Gibt es hier bereitwillige Spezialisten die mir helfen können meinen Fehler im Code zu finden?

Ich bin echt nicht gut in Informatik...

import java.awt.; import java.applet.; import java.util.Scanner;

public class KampfDerElemente extends Applet {

public static void main(String[] args) {

while(true) {

System.out.println("Sie haben die Wahl");

System.out.println("1 - Feuer");

System.out.println("2 - Wasser");

 System.out.println("3 - Luft");

 System.out.println("4 - Erde");

 System.out.println("5 - Elektro");

 Scanner input = new Scanner(System.in);

 int pcwahl;

 pcwahl = (int) (Math.random() * 5) + 1;

 int feuer = 1;

 int wasser = 2;

int luft = 3;

 int erde = 4;

 int elektro = 5;

if (input.nextInt() == pcwahl) {

System.out.println("Unentschieden!");}

if ((pcwahl == feuer) && (input.nextInt() == 3 || input.nextInt() == 5)){

System.out.println("Der Computer hat gewonnen!");

           }

else if (input.nextInt() == 2 || input.nextInt() == 4){

System.out.println("Sie haben gewonnen!");}

                    

           if ((pcwahl == wasser) && (input.nextInt() == 1 || input.nextInt() == 4)){

               System.out.println("Der Computer hat gewonnen!");}

                

               else if (input.nextInt() == 3 || input.nextInt() == 5){

                   System.out.println("Sie haben gewonnen!");}

                    

           if ((pcwahl == luft) && (input.nextInt() == 1 || input.nextInt() == 4)){

               System.out.println("Sie haben gewonnen!");}

                

               else if (input.nextInt() == 2 || input.nextInt() == 5){

                   System.out.println("Der Computer hat gewonnen!");}

                        

           if ((pcwahl == erde) && (input.nextInt() == 1 || input.nextInt() == 3)){

               System.out.println("Der Computer hat gewonnen!");}

                            

               else if (input.nextInt() == 2 || input.nextInt() == 5){

                   System.out.println("Sie haben gewonnen!");}

                    

           if ((pcwahl == elektro) && (input.nextInt() == 1 || input.nextInt() == 3)){

               System.out.println("Sie haben gewonnen!");}

                

               else if (input.nextInt() == 2 || input.nextInt() == 4){

                   System.out.println("Der Computer hat gewonnen!");}

                           }

                       }

                   }

LG Ollivoe

...zur Frage

Java, wie kann man auf mehrere Werte einer HashMap zugreifen?

Hallo, ich habe meine HashMpa folgendermaßen aufgebaut: HashMap map = HashMap

in einer neuen Klasse Item habe ich Item definiert:

public class Item {

Public int a,b,c;

public Item(Integer a, Integer b, Integer c){

 this.a = a;

this.b=b;

this.c=c;

}
}

Meine Frage nun:

Gibt es irgendeine Möglichkeit auf die Werte a,b, bzw. c aus der HashMap zuzugreifen?

Danke schonmal :)

...zur Frage

C# Wofür sind Klassen gut?

Servus,

ich arbeite grad an nem kleinen Referat über Klassen und Struckturen in C#. Ich hab mich vor geraumer Zeit nur mal kurz mit dem Thema beschäftigt, da ich es dann erstmal für nicht so wichtig hielt, da meine Programme auch so funktionierten. Jedoch stellt sich mir jetzt die Frage, wofür Klassen denn überhaupt gut sind ?

Wenn ich nach Klassen google, finde ich zwar etliche Seiten wo der Aufbau einer neuen Klasse ganz gut erläutert ist, aber eben nicht erklärt wird wofür diese denn überhaupt benötigt werden, wofür sie hilfreich sind, und wieso die denn miteingebaut werden.

In der Schule wurde uns mal kurz in einer Vertretungsstunde erklärt, dass eine Klasse ähnlich einer Struktur ist (wenn ich den Zettel noch richtig verstehe, ist schon länger her) der einzige Unterschied ist dass eine Klasse wie ein Array dynamisch ist und deswegen mit einem new angelegt werden muss. Aber ich kann in Visual Studio ja auch neue Klassen hinzufügen, also komplett neue .cs Dateien, also kann das ja wohl kaum dem ganzen Zweck der Sache entsprechen. Kann mich bitte jemand aufklären ? Wäre super.

LG

...zur Frage

Hashmap Key <INTEGER> mit int variable vergleichen Aber wie?

ich sitze grad an einer Hashmap in Java und würde gern den Key mit einer int Variable vergleichen Geht das überhaupt so? Beispiel

HashMap FeierTage = new HashMap(); FeierTage.put(13, "13. Tag im Jahr");

int variable = 14;

wie kann ich die beiden jetzt mit einander vergleichen?

Vielen Dank im Vorraus

RD

...zur Frage

Was möchtest Du wissen?