2013-09-09 2 views
1

Привета У меня есть базовый класс, содержащий один элемент строки как Belows:инициализировать переменный-член базового класса внутри класса ребенка и использовать в другом классе

public class BaseClass 
{ 
    public String test; 
} 

класс Ребенка, проходящий базовый класс, где я хочу, чтобы инициализировать проверочное значение ,

public class ChildClass extends BaseClass 
{ 
    public void initialize() 
    { 
     System.out.println("inside constructor of ChildClass."); 
     this.test="stringtest"; 
    } 
} 

Тест класс, где я хотел бы использовать значение тестовой переменной базового класса:

public class TestClass extends BaseClass 
{ 
    public void test() 
    { 
     new ChildClass().initialize(); 
     System.out.println(this.test); 
    } 
    public static void main(String[] args) { 
     new TestClass().test(); 
    } 
} 

Теперь мой выше код печатает пустой внутри тестового класса. почему так? хотя я инициализировал тестовую переменную в дочернем классе? я не ошибаюсь где-то в концепциях Java?

+0

Вы создаете * новый экземпляр * ChildClass' и инициализируете этот экземпляр - not * this *. Кроме того, постарайтесь привыкнуть к * не * используя общедоступные поля, как можно раньше ... –

+0

Привет всем спасибо за ответ !!! Я хотел бы продолжить эту дискуссию. что я хотел, так это то, что мой дочерний класс просто предположил, чтобы инициализировать тестовую переменную базового класса, а затем я хотел использовать тестовую переменную базового класса в других моих классах. так как я должен это сделать? Я не хочу делать экземпляры моего дочернего класса в тестовом классе. TIA –

+0

Это не совсем понятно, что вы имеете в виду, боюсь. Непонятно, почему «TestClass» вообще расширяет «BaseClass». –

ответ

1

проблема в том, что вы создаете новый ChildClass, но вы не устанавливаете его в переменной. то вы печатаете this.test, который никогда не устанавливается.

, когда вы находитесь в test методе вы в TestClass например:

enter image description here

вы создаете и устанавливая ChildClass класс

enter image description here

, но тогда вы печатаете TestClasstest член

enter image description here

, если вы просто хотите создать ChildClass и использовать это сделать

public class TestClass 
{ 
    public void test() 
    { 
     ChildClass cls =new ChildClass().initialize(); 
     System.out.println(cls.test); 
    } 
    public static void main(String[] args) { 
     new TestClass().test(); 
    } 
} 

или если вы хотите продлить ChildClass сделать

public class TestClass extends BaseClass 
{ 
    public void test() 
    { 
     initialize(); 
     System.out.println(this.test); 
    } 
    public static void main(String[] args) { 
     new TestClass().test(); 
    } 
} 
1

В примере, который вы опубликовали, есть два примера: BaseClass. Одним из них является экземпляр с номером new ChildClass(), а другой - методом main() (TestClass). Каждый из них, являющийся подклассом BaseClass, имеет свой собственный член test (это разные переменные с разными значениями).

Помните, что ключевое слово this всегда ссылается на экземпляр, в котором он используется.

В этом случае System.out.println(this.test); получает доступ к test свойству TestClass экземпляра, созданному в методе main.

Вам необходимо получить доступ к объекту test другого экземпляра. Вы можете сделать это, сохраняя ссылку на экземпляр ChildClass и доступ к test собственности впоследствии:

ChildClass instance = new ChildClass().initialize(); 
    System.out.println(instance.test); 

Вы можете найти следующую Java Tutorials страницу полезной: Using the this Keyword.

Также учтите, что TestClass не нуждается в расширении BaseClass. Вы можете продолжать доступ к instance.test, потому что это член public, но вы должны подумать о создании поля private и предоставить методы получения и сеттера. См. Следующий вопрос для получения соответствующей информации: Why use getters and setters?

+0

вы можете опубликовать фрагмент кода. где базовый класс имеет тестовую переменную. класс child имеет установщик этой тестовой переменной. и в тестовом классе есть получатель этой тестовой переменной.обратите внимание, что после установки тестовой переменной я должен иметь доступ к одному и тому же значению во всех других тестовых классах, которые расширяют базовый класс. как я могу это достичь. Я пытаюсь, но не в состоянии разобраться в дизайне относительно того, как сохранить вещи? –

+0

@Mrunal Есть ли какая-то конкретная причина для подхода наследования? Учтите, что каждый экземпляр класса или подкласса будет иметь свои собственные значения для переменных. Mayber вам будет лучше с [композицией] (http://stackoverflow.com/q/49002/851811). –

1

new ChildClass() и new TestClass() 2 разные объекты, даже если они распространяются общие BaseClass.

Имея общий BaseClass, как супер классне означает, что онаакции не входящих статические поля этого, со всеми экземплярами различных его подклассов

Это сработало бы, если test был static (общий класс поле) в BaseClass

0

Вам нужен экземпляр Child Class

ChildClass cls =new ChildClass().initialize(); 
System.out.println(cls.test); 


this is referring to the Test Class instance.