2015-04-04 4 views
-1

Если у меня есть Java Project с f.e 3 классами и думаю, что что-то происходит в вашем первом классе, и теперь вы хотите изменить значение в третьем классе, как вы можете это сделать?? Когда у меня первый класс, где я сделать ссылку на мой второй класс с чем-то вродеИзменение переменных из другого класса

SecondClass mSecondClass =new SecondClass() 

, а затем, по крайней мере во втором классе я создаю мой 3-го класса с

...=New ThirdClass() 

Если я реализовал метод во втором классе, как setValue(int v) Я могу изменить значение второго класса из моего первого класса, а затем сделать тот же Form второй в третьем классе, но не должен быть проще?

+0

Если они не являются статическими переменными, вы не изменяете значения в классах, вы изменяете значения в экземплярах классов. –

+0

Но если я объявляю переменную в своем классе f.e public int mValue = 0; Как я могу получить эту переменную из другого класса? –

+0

Ну, вы не можете получить доступ к переменной из любого места, пока не создадите экземпляр класса. ('new' создает экземпляр.) –

ответ

0

Да, может быть простой способ, непосредственно изменить значение ThirdClass объекта с вашего FirstClass. Почему вы даже пытаетесь общаться через SecondClass? Вы имели в виду использовать encapsulation? Это не так, как инкапсуляция работает в объектно-ориентированном программировании. Инкапсуляция - это создание абстракции данных из всех других классов, а не только одного (в вашем случае FirstClass). Вы можете предоставить эти интерфейсы (не те interface, но эти функции setValue) внутри вашего класса ThirdClass, а затем пусть FirstClass объекты также используют эти функции. Вы можете использовать свои классы внутри своего пакета, вы знали, что это не так?

Во-вторых, как уже упоминалось, изменение значений переменных зависит от переменных, которые вы хотите изменить.

  1. Статические переменные
  2. Переменные экземпляра

Если вы пытаетесь изменить статическую переменную, а затем создать новый экземпляр и обновляет значение, что-то вроде этого

ThirdClass three = new ThirdClass(); 
three.setValue(0); // int v 

В противном случае, если это статическое поле (переменная),

ThirdClass.Value = 0; // public int Value; «Без инкапсуляции» ПЛОХО!

Если вы испытываете инкапсуляцию тогда просто вызовите функцию (статической) внутри класса, как,

ThirdClass.setValue(0); // int v 
// it also assume you're having 
public static void setValue(int v) { /* code here */ } 

Таким образом, вы обновите значения. Вы можете подумать о том, чтобы взглянуть на «Understanding class members», это поможет вам понять, как с ними обращаются.

+0

Да, если бы я мог пропустить второй класс и связаться с class1 напрямую с классом3. Дело в том, что у меня нет экземпляра моего третьего класса в моем первом классе. Но могу ли я собрать экземпляр моего 3.класса в моем первом и втором классе?Это решило бы проблему; это означало бы, что у меня есть мой 3.объект (мой 3.Class и я могу получить этот объект от моего первого и второго класса? Или я создаю два объекта, когда я создаю две ссылки? Тогда ссылка в классе1 не будет совпадать с тем же objekt, как ссылка в классе 2, что я не хочу. –

+0

Подождите, расслабьтесь! Просто создайте экземпляр объекта в своем классе, который-так-всегда класс. Нет ограничений на экземпляры, просто убедитесь, что память имеет –

0

Вы пытаетесь взглянуть на всю систему и сразу контролировать ее. Точка объектно-ориентированного программирования состоит в том, чтобы скрыть детали того, как ваш 3-й класс может понадобиться, чтобы сделать что-то, вызванное вашим первым.

Необходимо, чтобы эти классы связывались друг с другом в первую очередь. Предположим, что первый класс - это то, где все начинается. Этот класс должен иметь четкий набор вещей, которые он позволяет своим пользователям запрашивать у него, и он должен реализовать эти вещи, изменив его внутренние ценности и попросив любые объекты внутри него сделать что-то, что ему поможет. Держите этот образ мышления, опустив цепь, и это будет иметь больше смысла.

Ваши комментаторы правы. Вам нужно различать класс - кучу кода, определяющий способ работы объекта - и объекты - конкретную вещь во время выполнения, которая получает и отправляет сообщения.

В сообщениях объектов Java есть действительно вызовы функций, и мы знаем, что за кулисами происходит немного процессуально-подобных потоков. Игнорируйте это.

Надеюсь, это поможет.

Вкратце - подумайте о делегировании ответственности за объект и способе программирования, когда вещи делают запросы к объектам, которые могут помочь.

Как более конкретный ответ, как некоторые объекты могут взаимодействовать.

class Train { 
    private Engine engine; 
    private Whistle whistle; 

    public Train() { 
     // these components are part of the train and so 
     // are constructed when it's constructed 
     engine = new Engine(); 
     whistle = new Whistle(); 
    } 

    public void go() { 
     whistle.toot(); 
     engine.start(); 
    } 
} 


class Driver { 
    private Train train; 
    private IPod iPod; 

    public Driver(IPod iPod, Train train) { 
     // the driver may be given any ipod 
     // and any train to drive 
     this.iPod = iPod; 
     this.train = train; 
    } 

    public void drive() { 
     iPod.startMusic(); 
     train.go(); 
    } 
} 

// main method 
IPod iPod = new IPodNano(); 
Train train = new Train(); 

Driver driver = new Driver(iPod, train); 
driver.drive(); 

Теперь вы видите, как делегирование ответственности может существовать в сети связанных объектов, которые связаны друг с другом во время выполнения в несколько различных способов.

+0

То, что вы упомянули, является моей проблемой. Язык, с которого я начал, был C, и там у вас есть «void main()», где я могу поместить все, что захочу, и программа будет следовать именно этой функции. Java не делает этого, и это то, что я должен придумать, так как я крашу первый учебник по Java. Все это легко думать о том, что ваша Программа действует как объекты реального мира, а не то, что делает компьютер, компьютер работает «больше похоже на C», чем на Java. Но я пытаюсь привыкнуть к этому! –

+0

Хорошо, после небольшого кодирования для меня получилось следующее. Если я создаю экземпляр с f.e «Class3 mClass3 = new Class3()« Я получу новый «самодействующий» объект. И это всегда произойдет, когда вы напишете этот код, поэтому создание экземпляра класса 3 в Class1 и Class2 не решит проблему, поскольку они не относятся к одному и тому же объекту (хотя эти созданные объекты действуют одинаково) - для объяснение одного из них было бы названо «Self-Acting objekt nr.1», а другое «Self-acting objekt nr.2» –

+0

Так что я не знаю, есть ли способ получить ссылку на уже существующий Objekt в классе, где этот объект не был создан, но если нет никакого способа, я должен изменить способ взаимодействия между собой между классами (fe, если я создам свой экземпляр класса 1 и class3 в классе2) –

0

После прочтения ссылки «понимание членов класса» Я, наконец, понял, почему вы можете писать «статические» перед вашими переменными или методами, и это также решает мою проблему. Спасибо всем за вашу помощь !

+1

Если статический решает вашу проблему, вы делаете это неправильно. –

+0

Что я делаю неправильно, когда я использую static? Потому что он работает для меня! Чтобы изменить значение статического переменная Я пишу что-то вроде «Class3.setValue (x)», и я могу писать ее повсюду и не нужно заботиться о том, есть ли у меня экземпляр класса в классе, где я изменяю значение или нет. Чтобы быть точным, что меня смутило, я где-то красный, чтобы изменить значение, которое у вас есть rite 'violatitle' "перед переменной. –

+0

Статика как глобальные переменные - если вы взламываете свой путь в статическое состояние класса, чтобы связать все вместе, то вам не хватает точки. Volatile используется при многопоточности. Честно говоря, Константин, вам, вероятно, нужно идти дальше и читать учебник для Java и OO, потому что это не лучший способ узнать некоторые из настоящих основ. Однако, в духе объяснения, см. Редактирование моего ответа выше. –

Смежные вопросы