Hallo leute,
Ich mochte eine statische methode(von andere klasse) verwenden, um eine Objekt zu erzeugen, und das referenz von diesem Objekt möchte ich an die Hauptklasse haben.
bei diese unterstehende Code habe ich immer nullpointer exception.
[Java]
public class Main {
static TestUser user = null;
public static void main(String argv[])
{
TestClass.makeUser(user);
System.out.println(user.getA());
}
}
public class TestClass {
public static void makeUser(TestUser user)
{
user = new TestUser(20,10);
}
}
public class TestUser
{
private int a;
private int b;
public TestUser(int a , int b)
{
this.a = a;
this.b = b;
}
int getA() {return a;}
int getB() {return b;}
}
[/code]
Bitte um Tipps! Danke (sry fuer mein schlechte sprache)
versuche es mal so:
[Java]
public class Main {
static TestUser user = null;
public static void main(String argv[])
{
user = TestClass.makeUser();
System.out.println(user.getA());
}
}
public class TestClass {
public static TestUser makeUser()
{
return new TestUser(20,10);
}
}
public class TestUser
{
private int a;
private int b;
public TestUser(int a , int b)
{
this.a = a;
this.b = b;
}
int getA() {return a;}
int getB() {return b;}
}
[/code]
Diese Direkte zuweisung ist mir schon klar. Aber wir könnte ich es demonstrieren dass dieses Object(TestUser) über die hilfsklasse TestClass erzeugt wird, und das referenz immer noch in "Main" class habe. (als Funktions parameter, nicht als rückgabe wert)
In Java gibt es kein Call-by-Reference. Siehe mehr dazu hier. Stattdessen gibt es Reflection:
Java:
publicclassMain{publicstaticvoidmain(finalString... args)throwsInstantiationException,IllegalAccessException{finalTestUser t =TestClass.mkUser(TestUser.class);finalGodUser g =TestClass.mkUser(GodUser.class);System.out.println(t);System.out.println(g);}}classTestClass{static<TextendsUser>TmkUser(finalClass<T> c)throwsInstantiationException,IllegalAccessException{return c.newInstance();}}interfaceUser{}classTestUserimplementsUser{@OverridepublicStringtoString(){return"TestUser";}}classGodUserimplementsUser{@OverridepublicStringtoString(){return"GodUser";}}
Wenn du Objekte dynamisch zur Laufzeit erstellen möchtest, dann kann das mit Reflection allerdings schnell frickelig werden. Wenn dir das aber sehr wichtig ist, empfehle ich, ein Dependency Injection Framework wie Guice zu verwenden.
Besten Dank.
Genau soetwas habe ich auch gesucht, versucht... zwar nicht geschafft gehabt.
Das ist das richtige beweis dass Java kein Call by Reference kennt. Es scheint sehr oft so dass es doch Call by reference gibt, doch die lokale Objekte(Parameterisierte Objekte) machen eine kopie und referenzieren auch auf das originale Objekt(funktiniert eben nur dann wenn es schon das Objekt vorher dynamisch erzeugt wurde).
Somit kann man die Originale Objekt manupulieren.