tomaschku
Goto Top

Methode einer Klasse in einer Klasse aufrufen

Hallo Leute!

Heut habe ich mal wieder ein Problem:
Ich habe in der Klasse "Haupt" eine reset() Funktion, die die reset() Funktionen der untergeordneten Klasse "starter" ausführen soll:

public class Haupt {
  Haupt() {
    xyz = 0;
  };
  
  public class starter {
    starter() {
      ex = 0;
    };
    public void setEX(int _in) { ex= _in; };
    public int getEX() { return ex; };
    public void reset() {
      ex= 0;
    };  
    private int ex;
  };

  public void setXYZ(int _in) { xyz = _in; };
  public int getXYZ() { return xyz; };
  public void reset() {
    xyz = 0;
    starter.reset();
  };  
  private int xyz;
};
Doch es möchte nicht funktionieren (NullPointerException beim Aufruf der Funktion). Da ich Java noch nicht lange benutze und auch durch googeln nichts brauchbares rauskam, weiß ich jetzt nicht mehr weiter.
Welche Regel habe ich missachtet?

EDIT:
Man kann natürlich "starter" außerhalb von "Haupt" verschieben und dann in Haupt einfach
starter Starter;
schreiben, aber ich sehe da 2 Probleme:
1. Die starter Klasse wäre public, was aus mehreren Gründen unpraktisch ist und
2. es wird dann auch unübersichtlich.

Mit freundlichen Grüßen
tomaschku

Content-ID: 373760

Url: https://administrator.de/contentid/373760

Ausgedruckt am: 24.11.2024 um 18:11 Uhr

136166
136166 13.05.2018 aktualisiert um 15:08:50 Uhr
Goto Top
starter.reset();
Du rufst eine Funktion von einer Klasse auf von der es keine Instanz gibt. Also erst eine Instanz dieser Klasse erzeugen und dann die Funktion auf dieser Instanz aufrufen, oder eben die Klasse als static deklarieren dann ist ein direkter Aufruf dessen Member möglich.
https://stackoverflow.com/questions/7486012/static-classes-in-java?utm_m ...
emeriks
emeriks 13.05.2018, aktualisiert am 14.05.2018 um 10:33:59 Uhr
Goto Top
Hi,
ich kenne mich zwar nicht konkret mit Java aus. Aber ich denke, dass Du die Klasse "Starter" erst einmal instantiieren oder diese als "static" deklarieren musst.

Also entweder in Klasse "Haupt" ein
  private Starter MyStarter;
einbauen und dann aufrufen über
 ...
MyStarter.Reset
...
oder in Klasse "Starter"
public static void reset() 
.....

deklarieren. Wobei ich jetzt aber keine Ahnung habe, ob und wie sich das bei Java mit diesem "static" verhält.

E.
SlainteMhath
SlainteMhath 14.05.2018 um 10:21:06 Uhr
Goto Top
Moin,

eine Static Methode geht mEn an der Stelle nicht, da die Methode "starter.reset()" mit einer private Variablen "ex" interagiert. Also muss eine Instanz her.

lg,
Slainte
tomaschku
tomaschku 16.05.2018 aktualisiert um 18:41:01 Uhr
Goto Top
Im zweitem Beitrag des Linkes bin ich auf folgenden Code gestoßen, der aber so nicht compiliert. Bei allen statics schreibt es "static is only allowed in constant variable declerations."

public final class MyStaticClass {
    private MyStaticClass () {
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

Auch final bei der Klasse und private beim Konstruktor machten da keinen Unterschied.
Beim entfernen der statics compiliert es zwar, kriege aber beim Aufruf von .reset() eine NullPointerException. (Keine Instanz)
SlainteMhath
Lösung SlainteMhath 17.05.2018 um 08:52:17 Uhr
Goto Top
Moin,

nochmal: "static" Methoden können nicht auf non-static Variablen/Methoden der Klasse zugreifen, da alle non-statics erst mit der Instanzierung der Klasse "entstehen". Ohne Instanzierung wird auch kein Konstruktur ausgeführt, also deine Varaible "myStaticNumber" nie mit der "1" gefüllt.

So in etwa:

public final class MyStaticClass { 
  public static int myStaticMember = 1;

  public static int staticMethod(int v) { 
     return MyStaticClass.myStaticMember ^ v;
 }
}

system.out.println(MyStaticClass.myStaticMember);
system.out.println(MyStaticClass.staticMethod(5));