Non static method Problem

soa

Erfahrenes Mitglied
Hallo zusammen,

ich habe beim erstellen eines Programms ein kleines Problem und hoffe, hier
ein wenig support zu erhalten. Ich versuche das Problem so pauschal wie möglich zu formulieren:

Ich habe in einem Programm einige Methoden deklariert, die auch auf Methoden und Attribute einer anderen Klasse zugreifen.
Die Methoden sind alle nicht als static dekalriert. Nun soll es in der Klasse eine Menü-Funktion geben , über die der User die einzelnen Methoden ansteuern kann.
Das Menü befindert sich also in der MAIN -Methode. Die anderen Methoden habe ich ausserhalb beschrieben. Jetzt wollte ich über eine Switch Anweisung die einzelnen Methoden aufrufen.

switch (menue){
case 1 : { methode1()
-------------------------------
so in etwa...Das funktioniert nur leider nicht, da ich versuche innerhalb der main-Methode auf Methoden zuzugreifen, die ich ausserhalb deklariert habe.

Das sollte doch irgendwie funktionieren, ohne die Methoden alle als static zu deklarieren

Vielen Dank.....

Gruß
SOA
 
Codeauszug

So sieht die Klasse aus. Die greift auf eine Klasse Auftrag zu!
Ich habe das Problem nicht mehr, wenn ich diese Klasse ohne Methoden mache.
Die Methoden sollen aber eigentlich rein

Gruß
SOA
..............

Auftrag auftrag1 = new Auftrag (111l,"Thorsten Petersen", 12, 45,true, 4856, 5.0f);
Auftrag auftrag2 = new Auftrag (112l,"Juergen Juergensen", 19, 24, false, 2900, 20.0f);
Auftrag auftrag3 = new Auftrag (113l,"Thorsten Petersen", 29, 52,true, 10000, 10.0f);


//Methoden

public double berechneEinnahmen(){

return(auftrag1.berechnePreis() + auftrag2.berechnePreis() +auftrag3.berechnePreis());

}//Methode geschlossen

//--------------------------------------------
public void erhoeheRabatt( double prozent){


java.io.BufferedReader in =
new java.io.BufferedReader(
new java.io.InputStreamReader(System.in));
/* Eingabestrom aus der Standardeingabe */

prozent= Double.parseDouble(in.readLine());

auftrag1.setRabatt(auftrag1.getRabatt + prozent);
auftrag2.setRabatt(auftrag2.getRabatt + prozent);
auftrag3.setRabatt(auftrag2.getRabatt + prozent);



}//Methode erheoheRabatt geschlossen

public void print(){
System.out.println("Hier sind alle Auftraege im Ueberblick:");
auftrag1.print();
auftrag2.print();
auftrag3.print();
}//print beendet


public void info(){

int auftrag =0;
if (auftrag == auftrag1.getAuftragsnummer())
auftrag1.print();
else
if (auftrag == auftrag2.getAuftragsnummer())
auftrag2.print();
else
if (auftrag == auftrag1.getAuftragsnummer())
auftrag3.print();
}//void Methode geschlossen



//main Methode
public static void main(String args[]) throws java.io.IOException
{

//Variablen werden deklariert
int menue = 0;


//F¸r die Standardeingabe
java.io.BufferedReader in =
new java.io.BufferedReader(
new java.io.InputStreamReader(System.in));
/* Eingabestrom aus der Standardeingabe */





//Bildschirmausgabe

System.out.println(" Menue der Auftragsverwaltung ");
System.out.println("--------------------------------");
System.out.println("Bitte waehlen Sie einen Menuepunkt:");
System.out.println("1. Ausgabe aller bisherigen Einnahmen (1):");
System.out.println("2. Rabatte fuer alle Auftraege erhoehen (2):");
System.out.println("3. Alle Auftraege drucken ( 3):");
System.out.println("4. Auftragsdaten ueber Auftr.nummer ausgeben (4):");
System.out.println("5. Menue verlassen (5):");
System.out.println("---------------------------------------------------");
System.out.println("");
System.out.print("Bitte geben Sie Ihren Menuewunsch ein:");

//Programmierung der Menue-auswahl



//Schleife wird erstellt

switch(menue){

case 1:{ berechneEinnahmen();
}//Case geschlossen
break;

case 2: { erhoeheRabatt();}
break;
case 3: { print();
}//case 3 geschlossen
break;
case 4: { info();
}//case geschlossen
break;

default: {
//System.out.println("Ihre Eingabe entspricht nicht den vorgegebenen Menuepunkten.");
//System.out.println("Bitte versuchen Sie es erneut:");

}//default geschlosssen
}//Switch Anweisung geschlossen


}//main Methode geschlossen

}//Klasse geschlossen
 
Nehmen wir an das sind die Methoden die du aufrufen willst:
Code:
class MenuAction {

    public void load() {
    }

    public void save() {
    }

    public void reset() {
    }
}

Das ist deine Klasse mit der Mainmethode

Code:
class SimpleApplication {

 public static void main(String[] args) {
     System.out.println("Wähle load(1) save(2) reset(3);
     InputStreamReader reader = new InputStreamReader(System.in);
     int op = Integer.parseInt(reader.read());
     MenuSelected  menu = new MenuSelected()
     switch(op) {
           case 1:
               menu.load();
           break;

           case 2:
               menu.save();
           break;

           case 3:
               menu.reset();
           break;
      }
 }
 
Ach das problem hast du.

Du kannst nicht aus einer statischen Methode heraus eine Instanzmethode der selben Klasse aufrufen, weil die statische Methode keiner Instanz sondern der Klasse selber zugehörig ist.
Deshalb funktioniert dieses nicht:
berechneEinnahmen();

Lösung: (Schlechtes Design)
die Methode berechneEinnahmen(); ebenfalls als statisch declarieren:

public static double berechneEinnahmen(){ ...

Lösung: (besser)
Die Main Methode instanziert eine Application klasse und ruft die run() Methode dieser auf:

Code:
class Application {
 
    public void run() {
         // hier alles rein was in der main Methode stand
    }

}


.....
public static void main() {
     new Application().run();
}
 
Ich kann immer noch nicht ganz folgen.
Wenn Du von einer anderen Klasse zugreifst, warum benutzt Du dann die main()-Methode?
Dass aus der statischen main()-Methode nur ebenso statische Funktionen aufgerufen werden können, ist doch wohl klar.
Wenn das anders geregelt werden soll, muss die switch-Anweisung raus aus der main()-Methode.
 
Hallo!

Du solltest alles aus deiner main-Methode in die Klasse, z.B. in den Konstruktor verschieben und die main nur dazu nutzen eine Instanz der Klasse zu erzeugen und evtl eine Methode aufzurufen. Dann hast du die beschriebenen Probleme nicht und arbeitest sauberer in OO-Hinsicht.

Grüsse TrueSun
 
Original geschrieben von Christian Fein
Ablaufsteuerung hat im Konstruktor nichts zu suchen, der ist nur für initialisierung da.

Sollte man m.E. etwas differenzierter sehen. Hier geht es lediglich darum, aus dem statischen Kontext der main()-Methode (als Programmstart) herauszukommen. Und dafür finde ich diese Vorgehensweise legitim. Oder programmierst Du alles in die main() hinein?
 
Original geschrieben von Snape
Sollte man m.E. etwas differenzierter sehen. Hier geht es lediglich darum, aus dem statischen Kontext der main()-Methode (als Programmstart) herauszukommen. Und dafür finde ich diese Vorgehensweise legitim. Oder programmierst Du alles in die main() hinein?

nein nur weshalb den Construktor falsch missbrauchen. Schau mal oben da habe ich ein Beispiel gegeben.

Das ganze gehört in eine Methode rein.
z.b run()

new Application().run();
ist auch nicht viel mehr zu schreiben als
new Application();
 

Neue Beiträge

Zurück