@Axeles
Нечего тут пока писать

Что скрывается за понятием сlass в ООП?

Здравствуйте. Скажите, пожалуйста, правильно ли я понимаю понятие класса в ООП?

Я понял это так: Напрямую с классом работать мы не можем, поэтому мы работаем с экземплярами класса (то есть с его объектами), которые в свою очередь имеют свойства, события и методы. У каждого объекта есть свой интерфейс который в свою очередь определяет какие запросы мы можем послать к этому объекту.

Но напрямую с объектом мы тоже не можем работать поэтому даём нашему объекту имя (то есть делаем на него ссылку указывая что созданное нами имя и есть тот самый объект). Непосредственно объект мы изменять не можем поэтому мы через оператор new создаём новый экземпляр этого объекта. С которым можем уже производить какие то действия.
Light lt = new Light()
lt on();


Как я понимаю на примере этого кода. Мы имеем объект OnClickListener с которым напрямую мы работать не можем. Поэтому мы даём этому объекту имя (то есть делаем ссылку на объект), в нашем случае это btnOK. Для того чтобы нам работать с btnOK мы должны создать экземпляр этого объекта, который в свою очередь мы сможем изменять (то есть который сможет реагировать на наши запросы).

У объекта OnClickListener существует событие onClick, которое срабатывает при нажатии на кнопку. У объекта tvOut есть событие setText, которое выводит необходимый нам текст.
OnClickListener btnOK = new OnClickListener() {
       @Override
       public void onClick(View v) {
         // Меняем текст в TextView (tvOut)
         tvOut.setText("Нажата кнопка ОК");
       }
     };

Так это понимаю я, но ведь OnClickListener - это не объект а метод. Причём тут его называют событием
<Button
    android:id="@+id/butHello"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:onClick="butHello_Click"
    android:text="Поздороваться" />

А тут методом.
public void butHello_Click(View v){
    TextView tvHello = (TextView)findViewById(R.id.textView1);
    tvHello.setText("Hello!!!");
}


В чём же тут разница?

Просьба не ругаться, а помочь разобраться, в чём моя ошибка. Мне необходимо это понять, желательно на примерах. Спасибо за помощь.
  • Вопрос задан
  • 3102 просмотра
Решения вопроса 1
Не понятно, что имеете ввиду под "напрямую работать с объектом"...

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

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

По конкретному коду я могу ошибаться, но вроде бы так:

OnClickListener - класс. Вы создаете объект этого класса. Метод onClick привязывается где-то еще к событию щелчка по кнопке. В вашем коде вы просто переопределяете его поведение. В частности вызываете метод объекта tvOut.

P.S. Возможно, что там, где вы читали, методы привязанные к событиям (пользовательского интерфейса и прочим) называют событиями.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
kynisa
@kynisa
I just press buttons.
вы путаетесь в базовых абстракциях - в этом ваша проблема. и даже если вам объяснить в чем конкретно вы ошиблись в данном вопросе, вы завтра прибежите с новым, и так до бесконечности.
вам нужна книжка, в которой больше про ооп, и меньше про кнопки :)
Ответ написан
svd71
@svd71
ваши рассуждения - лапша полнейшая.

Что бы понять, что такое объект нужно представить например производство обоев: трафарет - это класс, причем один рулон обоев уже объект со своими свойствами типа размер, цвет, состав бумаги и т.д.
В програмировании эта абстракция может что то немного объяснить, но далека от реальности. Все методы в объекте располагаяются в классе и остаются неизменными. Но сам объект представляет из себя выделенный объем памяди, достаточный что бы вместит все поля этого объекта. Соотвественно для методов объекта есть одна отличительная особенность: первый передаваемый параметр в них - это ссылка на область начала расположения объекта, хотя в среде разаработки эта переменная чаще не показывается. То есть получается мы используем методы, передавая им ссылку на объект, используют необходимые поля ссылаясь память отностительно начала объекта.

Другая интересная особенность - это классовые методы и поля (или применительно в к Яве - статические). Эти элементы уже распределены в классе в единственном экземпляре. Потому они и доступны из любого объекта. Но отличие таких методов от объектовых - первая переменная всегда ссылается на начало класса. Это значит в таких методах ничего не известно что творится в объектах. Да и вызов из них методов объектов всегда требует наличие самого уже созданного объекта. В некоторых ЯП такая проверка не проводится. поэтому можно иногда "смухлевать" : если в методе нет работы с полями объекта или ссылок на другие методы, где ведется работа с полями объекта, можно фиктивно вызвать указав, что объект это 0 (пример такого "глюка" есть в С++, в Дельфи, в ПХП [хотя это не язык]).

Поосторожней со словом "интерфейс". В ЯП интерфейсом называется расширение функциональности классов, внося в них общие признаки. Классы можно масштабировать только наследованием (инкапсуляцию касаться не будем). То есть два класса невозможно объединить общими признаками, если они не "родственники". Но тут на помощь приходят интерфейсы. Если предствить наследование как "вертикальное" расширение, то с интерфейсам добиваются "горизондального" расширения.

Теперь о событиях. Для того, что бы организвать какое то событие в ЯП нам необходимо знать две вещи: объект, который должен реагировать и метод, который нужно вызывать в этом объекте. Это означает, что событие описывается минимум двумя полями. В Яве это довольно проблематично каждый раз сосдавать такую сложную структуру. Поэтому для событий придумали листенеры - объекты, расширенные каким-либо специфическим интерфейсом. Наличие в объекте такого интерфейса дает гарантированное присуствие нужного метода и нам нужно сохранять только ссылку на нужный объект.
Ответ написан
Headmast
@Headmast
Ваша ошибка в том, что вы путаете методы и события. Более подробно про события можно почитать на msdn .
В данном случае butHello_Click это тот метод, который вызывается при наступление события кнопка нажата.
Ответ написан
Комментировать
Да, в догонку. Следует понимать, что сами объекты могут генерировать свои события, у которых могут быть свои слушатели (т.е. методы других объектов, вызываемые при возникновении событий).

Очень надуманный пример:
Вы делаете текстовое поле в который вводится текст. Есть некий объект, метод которого вызывается каждый раз когда пользовательский интерфейс генерирует событие типа onChange на этом поле. Ваш объект анализирует текстовое поле и, если оно соответствует какому-то значению, делает нечто. Предположим что это нечно нужно сделать средствами других объектов в системе. У вас есть вариант - либо в вашем объекте вызывать их методы. Либо генерировать событие типа "onTextFieldSetTo" и тогда другие объекты могут слушать это событие и работать самостоятельно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы