2017-04-02 5 views
-1

Klasse BasisWie die Instanz-Variable mit einem Wert innerhalb einer Methode der Superklasse in der Unterklasse Java

public class Base 
{ 
    public X obj; 
    public void setValue() 
    { 
     obj = new A(); 
    } 

} 

public class Util extends Base 
{ 
    public X obj; 

    public Util(X obj) 
    { 
     this.obj = obj; 
    } 

    public void function1() 
    { 
     obj.m1(); //obj is null 
    } 

    public void function2() 
    { 
     obj.m2(); //obj is null 
    } 

} 

Testklasse

Util Klasse initialisiert zugreifen

class Test extends Base { // obj inherited from superclass is null. Util utilObj = new Util(obj) public void testMethod() { utilObj.function1(); utilObj.function2(); } } 

Wie kann ich den initialisierten Wert im Konstruktor der util-Klasse übergeben, während ich sein Objekt innerhalb der Test-Klasse erstelle, so dass ich die Methode util class verwenden kann. Es gibt eine Null-Zeiger-Ausnahme. Ich möchte nicht den Aufruf von setValue() Methode in jedem Test class und offenlegen kann nicht als statisch deklarieren. d. h. public static X obj; in Base class.

Gibt es eine Möglichkeit, den initialisierten Wert der nicht statischen Variable innerhalb jede Methode der Superklasse direkt in seiner Unterklasse wie statische Variable initialisiert zugreifen. Bitte helfen Sie dieses Problem zu lösen.

+0

Verwenden Sie einen Konstruktor, der X als Parameter in der Basis –

+0

verwendet. Ihre 'Util' -Klasse hat eine Variable namens' obj', die sich von der 'obj' -Variablen in' Base' unterscheidet. Ist das beabsichtigt? Oder willst du 'Util' nur die' obj' Variable in der 'Base' Klasse benutzen? – Wyzard

+0

@Wyzard ich möchte nur obj Variable der Basisklasse in der Klasse util.Since ich muss das Obj von Test-Klasse übergeben, so habe ich Konstruktor in Util-Klasse, – user3598844

Antwort

0

Entfernen Sie die public X obj; Linie von der Util Klasse zu finden. Diese Zeile erzeugt eine unterschiedliche Variable in Util, die die von Base "versteckt", weil sie denselben Namen hat. Wenn Sie die Variable obj von Util entfernen, erhalten Sie durch Schreiben obj in Util Methoden die Base Variable.

public Base(X obj) 
{ 
    this.obj = obj; 
} 

und ändern Sie dann die Util Konstruktor es zu nennen:

Statt mit der Util Konstruktor initialisieren obj direkt, wäre es eine gute Idee, Base einen Konstruktor geben sein

public Util(X obj) 
{ 
    super(obj); // Calls Base constructor 
} 
+0

Ich kann den Obj-Inside-Konstruktor nicht initialisieren. Der Wert von obj wird nicht von einer externen Klasse übergeben, daher brauche ich keinen Konstruktor in der Base-Klasse. Er muss in der setValue() - Methode der Base-Klasse initialisiert werden. Danke für die Antwort ... Bitte helfen .. – user3598844

Verwandte Themen