Wie rufe ich die Methode "aufRufProdukte()" in folgenden Klassen in der Main-Methode auf?
Die Main-Methode steht in der 3.Klasse "public class Test {}"
Java:
//1.KlassepublicclassProdukte{// AttributepublicString name;publicint preis;//KoonstruktorpublicProdukte(String name,int preis){this.name = name;this.preis = preis;//Getter/Setter Ersetzt durch ......//2.KlassepublicclassProdukteMethoden{// aufzurufende MethodevoidaufRufProdukte(){Produkte[] produkte =newProdukte[4];for(int i =0; i<= produkte.length; i++){
produkte[i]=newProdukte("hall",(i+1)+(i+1)*10);}for(int i =0; i<= produkte.length; i++){System.out.println(produkte[i].preis);}}}
Wenn du nicht statische Methoden aufrufen möchtest, benötigst du immer ein Objekt der Klasse, welche die Methode besitzt.
Eine Objekt erzeugst du mit den Aufruf des Konstruktors.
Wenn du nicht statische Methoden aufrufen möchtest, benötigst du immer ein Objekt der Klasse, welche die Methode besitzt.
Eine Objekt erzeugst du mit den Aufruf des Konstruktors.
@DrPils Danke für die Antwort. Nur so funktioniert es leider nicht. Das Problem ist das Array vom Typ Klasse Objekt. Ich habe es noch einmal verändert. Es funktioniert leider immer noch nicht.
Edit:
Sehe gerade, dass du deinen Code als PDF beigefuegt hast.
Poste ihn immer in Code Tags, als Anhang hilft es keinem was, als pds schonmal garnicht.
Sehe nicht wieso du die Methode nicht aufrufen kannst. Gibt es einen Fehler, oder tut es nicht das was erwartet wird?
Der Aufruf der Methode wird sicherlich klappen.
Nur du wirst nichts sehen keine Ausgabe machen. Da du ein Array mit 0 Elementen erstellt hast. Somit wird deine for Schleife gar nicht durchlaufen.
Und in deine ersten gepostet Code wirst du eine Exception bekommen. Denn du hast ein Array mit 4 Elementen erstellt, gehst aber in der for Schleife von 0 bis 4 somit 5 Elemente durch. Beim 5. Wird eine OutOfBounds-Exception kommen.
i <= produkte length geht von 0 bis 4
i < produkte length geht von 0 bis 3
Bei der Methode setzte ich produkte auf 6 Elemente
void aufRufProdukte(){
produkte = new Produkte[6];
und die Test Klasse änderte ich in
public class Test {
public static void main(String[] args) {
ProdukteMethoden pm1 = new ProdukteMethoden();
pm1.aufRufProdukte();
}
}
Ich erhalte die Fehlermeldung "ArrayIndexOutOfBoundsException". Was ich überhaupt nicht verstehe. Ich muss eine Verbindung von der Klasse Produkte zur Klasse ProduktMethoden hinbekommen. Wenn es kein Array wäre würde es so funktionieren:
Produkte p1 = new Produkte("P", 20);
pm1.setProdukte(p1); und mit pm1 könnte ich dann auf die Methode aufRufProdukte zugreifen. Aber in diesem Fall wird das p1 bei pm1.setProdukte(p1) nicht akzeptiert.
@Jw456 Danke, die Zahlen wurden nun ausgeworfen. Vor den Zahlen soll laut meines Codes ein Buchstabe stehen. Das erfolgt noch nicht.
Wie stellt Klasse ProdukteMethoden hier den Bezug zur Klasse Produkte her?
public class ProdukteMethoden {
Produkte [] produkte;
public Produkte[] getProdukte() {
return produkte;
}
public void setProdukte(Produkte [] produkte) {
this.produkte = produkte;
}
void aufRufProdukte(){
produkte = new Produkte[3];
for(int i = 0; i< produkte.length; i++){
produkte = new Produkte("hall", (i+1)+(i+1)*10);
}
for(int i = 0; i< produkte.length; i++){
System.out.println(produkte.preis);
}
}
}
public class Test {
public static void main(String[] args) {
ProdukteMethoden pm1 = new ProdukteMethoden();
Produkte p1 = new Produkte("H", 20);
pm1.setProdukte(p1); // funktioniert nicht
Produkte p1 =newProdukte("H",20);
pm1.setProdukte(p1);// funktioniert nicht
pm1.aufRufProdukte();
Was wird den bei der Methode setProdukte als Parameter erwartet? Ein Array vom Datentyp Produkte.
Was hast du erstellt ein einzelnes Objekt davon kein Array. Kann nicht gehen.
Das Array erstelkst du ja erst in der aufRufProdukte Methode und füllst es da auch.
Wahrscheinlich soll das nur eine Ausgabe Methode sein.
Nicht die wo es erstellt und gefüllt wird.
@ Jw456 Ja, das kann ich nachvollziehen. Nur leider wird der Buchstabe immer noch nicht geschrieben. Ich denke, dies liegt daran, dass vom Objekt der Klasse Produkte Methoden keine Verbindung zum Objekt der Klasse Produkte besteht.
public class ProdukteMethoden {
Produkte [] produkte;
public Produkte[] getProdukte() {
return produkte;
}
public void setProdukte(Produkte [] produkte) {
this.produkte = produkte;
}
void aufRufProdukte(){
//produkte = new Produkte[3];
for(int i = 0; i< produkte.length; i++){
produkte = new Produkte("P", (i+1)+(i+1)*10);
}
for(int i = 0; i< produkte.length; i++){
System.out.println(produkte.preis);
}
}
}
public class Test {
public static void main(String[] args) {
ProdukteMethoden pm1 = new ProdukteMethoden();
//Produkte p1 = new Produkte("H", 20); // wird nicht verwendet
pm1.setProdukte(new Produkte[5]); // funktioniert
pm1.setProdukte(newProdukte[5]);// funktioniert// sinnlos ein Array mit 5 Elementen erstelln// in der folge Methode erstellst du wider ein neues mit 3 und weist es der geichen Variable zu.// somit wird das Objekt wider vom GC geöscht
pm1.aufRufProdukte();
Code:
for(int i = 0; i< produkte.length; i++){
produkte = new Produkte("P", (i+1)+(i+1)*10);
}
Wenn du dem Elementen des Arrays andere Werte geben willst musst du das in der For schleife machen.
Du gibst jeden Element das "P" mit.
willst du es im nachträglich ändern brauchst du.
Das Array den Index bekommst somit die Instanz von dem Objekt was im Array ist , nun kannst du mit dem setter den Namen ändern.
Code:
public class ProdukteMethoden {
Produkte [] produkte;
public Produkte[] getProdukte() {
return produkte;
}
void changeOneProduktInArray(int index, String st){
Produkt pd = produkte[index];
pd.setName(st);
}
@Jw456 Ja, so ist es besser. Nur warum wird kein Buchstabe ausgeworfen? Woher kennt das Objekt pm1 die Klasse Produkte. Ich gehe eigentlich davon aus, dass ich ein Objekt von Produkte erstellen müsste und dieses Objekt mit einem Objekt der Klasse ProdukteMethoden verbinden muss. Dann würde die Methode wahrscheinlich auch den Buchstaben ausgeben.
Java:
publicclassProdukteMethoden{Produkte[] produkte;publicProdukte[]getProdukte(){return produkte;}publicvoidsetProdukte(Produkte[] produkte){this.produkte = produkte;}voidaufRufProdukte(){//produkte = new Produkte[3];for(int i =0; i< produkte.length; i++){
produkte[i]=newProdukte("P",(i+1)+(i+1)*10);}for(int i =0; i< produkte.length; i++){System.out.println(produkte[i].preis);}}}publicclassTest{publicstaticvoidmain(String[] args){ProdukteMethoden pm1 =newProdukteMethoden();//Produkte p1 = new Produkte("H", 20);
pm1.setProdukte(newProdukte[6]);// funktioniert nicht
pm1.aufRufProdukte();
pm1.setProdukte(newProdukte[5]);// funktioniert// sinnlos ein Array mit 5 Elementen erstelln// in der folge Methode erstellst du wider ein neues mit 3 und weist es der geichen Variable zu.// somit wird das Objekt wider vom GC geöscht
pm1.aufRufProdukte();
Code:
for(int i = 0; i< produkte.length; i++){
produkte = new Produkte("P", (i+1)+(i+1)*10);
}
Wenn du dem Elementen des Arrays andere Werte geben willst musst du das in der For schleife machen.
Du gibst jeden Element das "P" mit.
willst du es im nachträglich ändern brauchst du.
Das Array den Index bekommst somit die Instanz von dem Objekt was im Array ist , nun kannst du mit dem setter den Namen ändern.
Code:
public class ProdukteMethoden {
Produkte [] produkte;
public Produkte[] getProdukte() {
return produkte;
}
void changeOneProduktInArray(int index, String st){
Produkt pd = produkte[index];
pd.setName(st);
}
@Jw456 Ja klar, wenn der Name nicht in "System..." aufgerufen wird, kann es nicht funktionieren. Deinen zweiten Teil schaue ich mir noch mal in Ruhe an. Erst einmal vielen Dank.
Schau dir den eben geposteten Text einfach mal an ...
Fällt dir daran denn nichts Ungewöhnliches auf?
Z.B. dass du einem Array einen kursiven einfachen Wert zuweist?
Wie gesagt: Immer Code-Tags verwenden zum Posten von Code.