# public variable erstellen, & darauf zugreifen



## Fasko (15. Apr 2011)

Hallo Leute,

ich experimentiere aktuell ein wenig mit Methoden herum. Das Ziel ist eine Art Taschenrechner mit Funktionen die ich mir teils noch ausdenken will & werde.
Vorweg. Das Programm ist noch (lange) nicht fertig.

Jetzt habe ich eine public array erstellt // werte
Im Hauptprogramm möchte ich über eine Methode Werte im Array zu speichern... Eclipse will das Programm in seiner derzeitigen Form jedoch nicht compilen.


```
import java.io.*;
import java.util.*;

public class J08_AE {
	
	public  double[] werte = new double[2];

    /**
     * @param args
     */
    public static void main(String[] args) throws IOException
    {
        // TODO Auto-generated method stub
        
        
        
        String einlesen;
        
        int zahlBuf;
        Random generator = new Random();
        int oGrenze = 0;
        int uGrenze = 0;
        int text;
        
        
        texte(0);
        
        texte(1);
        //einlesen = leser();
        zahlBuf = Integer.parseInt(leser());
        System.out.println(zahlBuf);
        speicher(0,zahlBuf);
        
        texte(2);
        zahlBuf = Integer.parseInt(leser());
        System.out.println(zahlBuf);
        speicher(1,zahlBuf);
        
        
   //     System.out.println(werte[1]);
        
            
        
        

    }
    
    public static double speicher (int i, int zahl)
    {
      // public  double[] werte = new double[2];
        werte[i] = zahl;
        // System.out.println("Index:" + i);
        // System.out.println("Zahl:"+ zahl);
        // System.out.println(werte[i]);
        return 0;
    }
    
    public static String leser ()throws IOException
    {
        BufferedReader stupid = new BufferedReader (new InputStreamReader(System.in));
        String strBuf = stupid.readLine();
        return strBuf;
    }
    
    public static void texte (int auswahl)
    {
    System.out.println("Test");
    
    // Deklaration
    
    
    switch (auswahl)
    {
    case 0:
        System.out.println("Willkommen beim Dschinni-Rechner!");
        break;
    case 1:
        System.out.println("Geben Sie bitte die Obergrenze ein");
        break;
    case 2:
        System.out.println("Geben Sie bitte die Untergrenze ein");
        break;
    case 3:
        System.out.println("Durchschnitt");
        break;
    case 4:
        System.out.println("Maximum");
        break;
    case 5:
        System.out.println("Minimum");
        break;
    case 6:
    	System.out.println("Addieren = 1\tSubtrahieren = 2\tMultiplizieren = 3\tDividieren = 4");
        break;
        
        default:
            System.out.println("Ach leck mich doch! Dafür werde ich nicht bezahlt!");
        
        
    }

    }

}
```

Wo liegt mein (Denk-)Fehler?

// Wie mache ich diese aufklappbaren Dinger... 


Gruß,

Fasko


----------



## Crian (15. Apr 2011)

mit [ JAVA ] ... [ /JAVA ] ohne die Leerzeichen darin kannst du deinen Code hübscher darstellen.




> Eclipse will das Programm in seiner derzeitigen Form jedoch nicht compilen.



Da wäre es fein, die Fehlermeldung mit anzugeben.


Ich habs mal in Eclipse kopiert. Die Meldung "change modifiert of 'werte' to static" sollte aussagekräftig sein?


Ich würde dir raten, von statischen Methoden in der Regel die Finger zu lassen, es sei denn du hast einen guten Grund dafür (Singleton o.ä.). Im Moment betreibst du da prozedurale Programmierung.


[c]public double[] werte = new double[2];[/c] halte ich auch für keine gute Idee. Sowas sollte man privat halten und höchstens über getter / setter zur Verfügung stellen.


Namen sollten sprechend sein. J08_AE ist alles andere.


----------



## Volvagia (15. Apr 2011)

Du willst von einer Klassenmethode auf eine Instanzvariable zugreifen. Geht natürlich nicht. Entweder, du "entstaticisierst" die Methode (dabei kannst du sie natürlich aus der main nichtmehr ausrufen), oder du machst die variable static.


----------



## Crian (15. Apr 2011)

Vorschlag (man kann immer noch über viiieles dabei reden)


```
package forumProblems;

import java.io.*;
import java.util.*;

public class J08_AE {

    private double[] werte = new double[2];

    public static void main(String[] args) throws IOException {
        new J08_AE();
    }

    public J08_AE() throws IOException {
        String einlesen;

        int zahlBuf;
        Random generator = new Random();
        int oGrenze = 0;
        int uGrenze = 0;
        int text;

        texte(0);

        texte(1);
        // einlesen = leser();
        zahlBuf = Integer.parseInt(leser());
        System.out.println(zahlBuf);
        speicher(0, zahlBuf);

        texte(2);
        zahlBuf = Integer.parseInt(leser());
        System.out.println(zahlBuf);
        speicher(1, zahlBuf);

        // System.out.println(werte[1]);

    }

    private double speicher(int i, int zahl) {
        // public double[] werte = new double[2];
        werte[i] = zahl;
        // System.out.println("Index:" + i);
        // System.out.println("Zahl:"+ zahl);
        // System.out.println(werte[i]);
        return 0;
    }

    private String leser() throws IOException {
        BufferedReader stupid = new BufferedReader(new InputStreamReader(
                System.in));
        String strBuf = stupid.readLine();
        return strBuf;
    }

    private void texte(int auswahl) {
        System.out.println("Test");

        // Deklaration

        switch (auswahl) {
            case 0:
                System.out.println("Willkommen beim Dschinni-Rechner!");
                break;
            case 1:
                System.out.println("Geben Sie bitte die Obergrenze ein");
                break;
            case 2:
                System.out.println("Geben Sie bitte die Untergrenze ein");
                break;
            case 3:
                System.out.println("Durchschnitt");
                break;
            case 4:
                System.out.println("Maximum");
                break;
            case 5:
                System.out.println("Minimum");
                break;
            case 6:
                System.out
                        .println("Addieren = 1\tSubtrahieren = 2\tMultiplizieren = 3\tDividieren = 4");
                break;

            default:
                System.out
                        .println("Ach leck mich doch! Dafür werde ich nicht bezahlt!");
        }
    }

}
```

Jetzt ist nur noch main statisch, und alles außer dem Konstruktor ist nun privat. Außerdem ist es ausführbar und ähnelt deinem Code noch einigermaßen.


----------



## Fasko (15. Apr 2011)

Crian, ich habe deinen Code mal übernommen.
Da kommt die Meldung "Return Type for the Methode is missing"

Vielleicht übersehe ich hier eine Kleinigkeit... Java-Anfänger :rtfm:


----------



## AmunRa (15. Apr 2011)

Bist du dir sicher, dass dein Java-File auch den richtigen Namen hat, bzw. der Konstruktor den Namen der Klasse hat und nicht irgendwo ein GROSZ/klein Schreibfehler darin ist.


----------



## Crian (15. Apr 2011)

Hast du das mit copy & paste als ganzes gemacht? Oder nur Teile übernommen? Im letzteren Fall kann natürlich irgendwas nicht zusammen passen.


----------



## Fasko (15. Apr 2011)

Kann mir vielleicht jemand sagen was bei Zeile 10 und 11 passiert? Bzw. was genau die in Crains Code macht?


----------



## Crian (15. Apr 2011)

meinst du

[JAVA=10]     public static void main(String[] args) throws IOException {
        new J08_AE();
    }[/code]

?

Da wird ein Objekt dieser Klasse erstellt. Damit ist das ganze Objektorientierter. Alles weitere passiert dann im aufgerufenen Konstruktor

[JAVA=14]    public J08_AE() throws IOException {[/code]


----------



## akimoon (15. Apr 2011)

Ich schreib es zwar ungern, aber vielleicht wäre erstmal ein bisschen Grundlagen-Schulung nötig für das Projekt.
Was ist ein Konstruktor? Was sind statische Methoden und wofür verwendet man sie? Vielleicht täuscht mich mein Eindruck ja auch, aber ich glaube, Fasko kann damit noch nicht wirklich viel anfangen und weiß daher auch nicht, woher der Fehler nun wirklich kam?

Grundlegend ein kleiner Hinweis zu statischen & instanz-Variablen von mir:

Variablen, die du mit "static" deklarierst, gehören zu einer Klasse, und können auch direkt über den Klassennamen angesprochen werden. Zum Beispiel der Wert "kaufpreis" der Klasse "MercedesSLK" könnte über MercedesSLK.kaufpreis abgerufen werden.

Sollte es nun allerdings unterschiedliche Preise geben, wäre es gut wenn jeder MercedesSLK seinen eigenen Preis hätte. Hierzu wird das Schlüsselwort "static" weggelassen. Somit gehört jeder Kaufpreis zu dem jeweiligen MercedesSLK. Einen MercedesSLK kann man über "new MercedesSLK();" anlegen. 

Falls du dies bereits wusstest.. überles es einfach nachträglich


----------



## Fasko (15. Apr 2011)

Ohh... da hatte ich doch etwas mit dem Namen übersehen 

Generell bin ich schon im Besitz von Programmierkenntnissen. Bis vor zwei Jahren habe ich noch schulischbedingt mit C# gearbeitet (zwei Jahre Erfahrung^^). Es sind nicht die herausragenden Kenntnisse, die ich dort erworben habe, aber alles habe ich nun auch nicht vergessen.

So, nun will ich mich (auch schulisch bedingt) mit Java beschäftigen. :lol:


Ich habe aus meiner damaligen Zeit noch etwas mit "get- & set-Methoden" im Kopf. Aber ich weiß nicht mehr genau was..... ;( Mein Ziel ist es unter anderem, später auf die in einer Methode gespeicherten Daten (im Array) wieder zugreifen zu können.

MfG,

Fasko


----------



## Volvagia (15. Apr 2011)

Ich weiß jetzt nicht, ob das eine Frage war, aber Crian hat dir ja schon einen Setter gepostet:


```
private double speicher(int i, int zahl) {
	// public double[] werte = new double[2];
	werte[i] = zahl;
	// System.out.println("Index:" + i);
	// System.out.println("Zahl:"+ zahl);
	// System.out.println(werte[i]);
	return 0;
}
```

oder gekürzt:


```
private void setZahl(double value, int field) {
	werte[field] = value;
}
```

Und dazu passend ein getter:


```
private double getZahl(int field) {
	return(werte[field]);
}
```

Wenn du die Sichtbarkeit ausdehnst, kannst du sogar von anderen Klassen darauf zugreifen. Arrays soll man sowieso niemals übergeben (lt. Findbugs), ich weiß aber nicht mehr warum nicht.


----------



## Crian (15. Apr 2011)

Wenn man das von außen nutzen will, sollte es natürlich wieder "public" sein.

Und es gibt da Namenskonventionen.
Normale Getter lauten mit getVariablenname() und die Setter setVariablenname(). Bei boolschen Variablen hingegen fängt man mit is... oder has... an.


----------

