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-Key: 373760

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

Printed on: April 19, 2024 at 13:04 o'clock

Mitglied: 136166
136166 May 13, 2018 updated at 13:08:50 (UTC)
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 ...
Member: emeriks
emeriks May 13, 2018, updated at May 14, 2018 at 08:33:59 (UTC)
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.
Member: SlainteMhath
SlainteMhath May 14, 2018 at 08:21:06 (UTC)
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
Member: tomaschku
tomaschku May 16, 2018 updated at 16:41:01 (UTC)
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)
Member: SlainteMhath
Solution SlainteMhath May 17, 2018 at 06:52:17 (UTC)
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));