Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
XOlegX
Сообщений: n/a
#1

this в Java - Android

31.10.2013, 03:41. Просмотров 905. Ответов 15
Метки нет (Все метки)

Доброго времени суток,
Недавно начал изучение программирование на андроид, знаком с основами java. При чтении различных курсов, часто встречаю this, при этом не понимая о чем на самом деле идет речь в контексте. Находил в буржнете об этом информацию, но всё равно не понятно. Объясните тупому. Вот пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MainActivity extends Activity implements OnClickListener {
 
   TextView tvOut;
   Button btnOk;
   Button btnCancel;
 
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);
 
     // найдем View-элементы
     tvOut = (TextView) findViewById(R.id.tvOut);
     btnOk = (Button) findViewById(R.id.btnOk);
     btnCancel = (Button) findViewById(R.id.btnCancel);
 
     // присваиваем обработчик кнопкам
     btnOk.setOnClickListener(this);
     btnCancel.setOnClickListener(this);
   }
 
   @Override
   public void onClick(View v) {
     // по id определеяем кнопку, вызвавшую этот обработчик
     switch (v.getId()) {
     case R.id.btnOk:
       // кнопка ОК
       tvOut.setText("Нажата кнопка ОК");
       break;
     case R.id.btnCancel:
       // кнопка Cancel
       tvOut.setText("Нажата кнопка Cancel");
       break;
     }
   }
 
 }
.

Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2013, 03:41     this в Java
Посмотрите здесь:

Обучение Java Android
Android формулы на java
Android C++ vs Java
Android c++/c#/Java
Android Совместимости Java
Java коллекции Android
Android Java spinner
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
31.10.2013, 03:56     this в Java #2
ссылка на текущий объект. в данном случае MainActivity.
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 415
31.10.2013, 09:40     this в Java #3
Цитата Сообщение от V0v1k Посмотреть сообщение
ссылка на текущий объект. в данном случае MainActivity.
У меня встречный вопрос.
Иногда при передаче параметра в ф-ю не принимает значение "MyActivity", зато принимает "MyActivity.this".
Я правильно понимаю, что MyActivity - объект, а требует ссылку?
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
31.10.2013, 12:07     this в Java #4
В java|android вы не работаете с объектами, а работаете с ссылками на объект. MyActivity - имя класса, MyActivity.this - ссылка на объект
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.11.2013, 02:20     this в Java #5
Цитата Сообщение от Slon747 Посмотреть сообщение
У меня встречный вопрос.
Иногда при передаче параметра в ф-ю не принимает значение "MyActivity", зато принимает "MyActivity.this".
Я правильно понимаю, что MyActivity - объект, а требует ссылку?
MyActivity - название класса, а MyActivity.this это уже ссылка на текущий объект данного класса.
Цитата Сообщение от lavan Посмотреть сообщение
В java|android вы не работаете с объектами, а работаете с ссылками на объект. MyActivity - имя класса, MyActivity.this - ссылка на объект
а если я пишу например следующее:
Java
1
new MyThread().start();
где тут ссылка?
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
06.11.2013, 17:52     this в Java #6
Цитата Сообщение от V0v1k Посмотреть сообщение
а если я пишу например следующее:
Код Java(TM) 2 Platform Standard Edition 5.0
1
new MyThread().start();
здесь вы создаёте анонимную ссылку
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
07.11.2013, 03:43     this в Java #7
Цитата Сообщение от lavan Посмотреть сообщение
здесь вы создаёте анонимную ссылку
вы что-то путаете с анонимными классами. что-то с передачей объектов по значению ссылки. проще говоря - что-то недослышали, что-то недопоняли.
я создаю объект класса MyThread без ссылки.
официальна документация гласит:
Instantiation: The new keyword is a Java operator that creates the object.
переведу на всякий случай: оператор new создает объект (не ссылку)

Добавлено через 24 минуты
и вообще, ООП гласит что все есть объект , а вы тут говорите что мы с ними вообще не работаем.
kpoxaa
70 / 31 / 1
Регистрация: 03.08.2012
Сообщений: 446
07.11.2013, 12:15     this в Java #8
В яве же, как таковы нет ссылок... или есть?
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
07.11.2013, 13:17     this в Java #9
Цитата Сообщение от V0v1k Посмотреть сообщение
а вы тут говорите что мы с ними вообще не работаем.
и тем не менее, не работаете! в java не много размыто понятие *объект*. Вот здесь
Java
1
Object obj = new Object();
вы получаете ссылку на объект. а вот так вы передаёте анонимную ссылку на объект
Java
1
Thread thr = new Thread(new Runnable(){public void run()})
и на ней запустится метод run
Java
1
thr.start()
Нужно различать в каком контексте применяется слово *объект*
1)объект - выделение памяти под описание(объявляя класс вы говорите компилятору как выделять память под объект).Здесь вы работаете с ссылкой
2)объект - как структурная единица.здесь как раз и работает ваше *всё есть объект*. т.е вы не можете вне класса объявить какую либо переменную базового типа(int)
проще говоря - что-то недослышали, что-то недопоняли.
давайте без пренебрежений
Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
07.11.2013, 14:37     this в Java #10
Цитата Сообщение от lavan Посмотреть сообщение
а вот так вы передаёте анонимную ссылку на объект
нет такого понятия как "анонимная ссылка". потому что это нонсенс.
Цитата Сообщение от lavan Посмотреть сообщение
Thread thr = new Thread(new Runnable(){public void run()})
Это анонимный класс.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
07.11.2013, 16:07     this в Java #11
Цитата Сообщение от Netscape Посмотреть сообщение
Это анонимный класс.
да вы правы.я имел в виду,что все равно создастся объект а в конструктор передастся ссылка на этот объект
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
08.11.2013, 02:58     this в Java #12
lavan, Netscape все правильно сказал.

Цитата Сообщение от lavan Посмотреть сообщение
Здесь вы работаете с ссылкой
создаю объекты и работаю с ними посредством ссылок раз уж на то пошло. и то, понятие ссылка упускается, всегда говорят "передать объект" а не "передать ссылку" в професиональном жаргоне.
Цитата Сообщение от lavan Посмотреть сообщение
1)объект - выделение памяти под описание
и об выделение/освобождение памяти мы(джависты) не заботимся, только об освобождение ссылок.
больше сишное определение чем джавишное, а вот второе больше джавишное.
Добавлено через 3 минуты
Цитата Сообщение от lavan Посмотреть сообщение
да вы правы.я имел в виду,что все равно создастся объект а в конструктор передастся ссылка на этот объект
это вы уже про передачу объектов по значению ссылки
не смешивайте понятия.

вот так мы вообще ссылки не имеем:
Java
1
new Object();
как я уже писал выше: где-то недослышали, где-то недопоняли и объединили анонимные классы и передачу аргументов по значению ссылки в что-то свое, вымышленное.

Добавлено через 2 минуты
Цитата Сообщение от lavan Посмотреть сообщение
и тем не менее, не работаете! в java не много размыто понятие *объект*. Вот здесь
Java
1
Object obj = new Object();
вы получаете ссылку на объект.
в первую очередь мы здесь создаем объект класса Object, я вам уже приводил вырезку с официальной документации.
сначала выполняет то, что справа от '=', а именно создание объекта, а только потом идет присваивание. учите мат часть.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
08.11.2013, 13:19     this в Java #13
Цитата Сообщение от V0v1k Посмотреть сообщение
и об выделение/освобождение памяти мы(джависты) не заботимся, только об освобождение ссылок.
если на то пошло,то ссылка ссылается на область памяти выделенной для объекта,а поскольку в java с памятью работает GC то и ссылки удаляет он же,кроме некоторых случаев работы с ресурсами!
Цитата Сообщение от V0v1k Посмотреть сообщение
Добавлено через 2 минуты
Цитата Сообщение от lavan Посмотреть сообщение
и тем не менее, не работаете! в java не много размыто понятие *объект*. Вот здесь
Код Java(TM) 2 Platform Standard Edition 5.0
1
Object obj = new Object();
вы получаете ссылку на объект.
в первую очередь мы здесь создаем объект класса Object, я вам уже приводил вырезку с официальной документации.
сначала выполняет то, что справа от '=', а именно создание объекта, а только потом идет присваивание.
Давайте разбираться по шагово
Java
1
Object obj = new Object()
Объявляется переменная типа класса. Она представляет собой переменную которая может ссылаться на объект. Затем распределяется память под объект(справа от *=*) и возвращается ссылка на него. Эта ссылка представляет собой адрес объекта в памяти распределённой операцией new. затем эта ссылка сохраняется в переменной obj!(Справочник Г. Шилдта) отсюда, объясню для вас и это
Java
1
new Object()
здесь JVM скрывает от вас '=' и все,что находится слева,но алгоритм создания объекта и получения ссылки на него остаётся неизменным!!
советую вам более тщательно читать мат часть!
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.11.2013, 01:43     this в Java #14
Цитата Сообщение от lavan Посмотреть сообщение
если на то пошло,то ссылка ссылается на область памяти выделенной для объекта,а поскольку в java с памятью работает GC то и ссылки удаляет он же,кроме некоторых случаев работы с ресурсами!
ссылки на ненужные объекты нужно обнулять что GC смог освободить память занимаемою объектом

Цитата Сообщение от lavan Посмотреть сообщение
здесь JVM скрывает от вас '=' и все,что находится слева,но алгоритм создания объекта и получения ссылки на него остаётся неизменным!!
будьте внимательнее, разговор о том, с чем мы работаем а не JVM. вы же писали "В java|android вы не работаете"

Цитата Сообщение от lavan Посмотреть сообщение
Объявляется переменная типа класса. Она представляет собой переменную которая может ссылаться на объект. Затем распределяется память под объект(справа от *=*) и возвращается ссылка на него. Эта ссылка представляет собой адрес объекта в памяти распределённой операцией new. затем эта ссылка сохраняется в переменной obj!(Справочник Г. Шилдта) отсюда, объясню для вас и это
как я и говорил, в первую очередь создается объекта и мы получаем на него ссылку чтобы посредством ссылки с ним(объектом) работать. или вы меня упрекнули в том, что я не упомянул об объявлении переменной?
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
09.11.2013, 14:51     this в Java #15
Цитата Сообщение от V0v1k Посмотреть сообщение
ссылки на ненужные объекты нужно обнулять что GC смог освободить память занимаемою объектом
ничего обнулять не нужно! как только у ссылки закончится 'время жизни' или она выйдет из область видимости GC её удалит,кроме случаев работы с ресурсами, но такие ссылки имеют методы которые говорят GC, что работа с ссылкой закончена
Java
1
2
FileInputStream fis .....
fis.close()
Цитата Сообщение от V0v1k Посмотреть сообщение
будьте внимательнее, разговор о том, с чем мы работаем а не JVM. вы же писали "В java|android вы не работаете"
я внимателен,а вот вы путаетесь в понятиях и определениях это наверно от того,что где то, что то, слышали но вникать не стали.
Java
1
new Object()
создание объекта и возвращение ссылки на него, выполнит jvm. а теперь мы работаем с ссылкой
Java
1
new Object().someMethod()
Цитата Сообщение от V0v1k Посмотреть сообщение
или вы меня упрекнули в том, что я не упомянул об объявлении переменной?
я вас ни в чём не упрекал. вы спросили
а если я пишу например следующее:
Код Java(TM) 2 Platform Standard Edition 5.0
1
new MyThread().start();
где тут ссылка?
и я вам уже третий день объясняю где она здесь!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2013, 22:17     this в Java
Еще ссылки по теме:

Android Параметры R.java
Rx Java Android
Курс по Java Android
Rx Java Android
Android Связка С++ и Java

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.11.2013, 22:17     this в Java #16
Цитата Сообщение от lavan Посмотреть сообщение
такие ссылки имеют методы которые говорят GC, что работа с ссылкой закончена
Java
1
2
FileInputStream fis .....
fis.close()
опять нонсенс, здесь просто закрывается поток, не больше, не меньше.
цитата с документации: "Closes this stream."
да и это метод не ссылки а класса FileInputStream.

Цитата Сообщение от lavan Посмотреть сообщение
ничего обнулять не нужно! как только у ссылки закончится 'время жизни' или она выйдет из область видимости GC её удалит,кроме случаев работы с ресурсами. но такие ссылки имеют методы которые говорят GC, что работа с ссылкой закончена
никто и не говорил что нужно обнулять ссылку которая и так выходит с области видимости, но она может не выходить с области видимости до завершения программы, каждый опытный программист знает что обнуляя ссылки мы даем GC'у право очистить память.
приведу вам пример:
есть некая программа с авторизацией. есть статическое поле account. сделали мы logout и account нам уже не нужен, но GC не сможет освободить память и не сможет сам обнулить account как вы утверждали, мы сами должны это сделать. это же касается всяких там сингтонов.

вот еще вариант:
Однако, надо понимать, что проповедуемая Java технология "создал объект, попользовался и бросил" работает удовлетворительно не всегда. Например, вполне можно представить себе такой (пусть не очень грамотный) метод: создается массив matrix большого размера (например, квадратной матрицы), он перерабатывается в другой массив (например, в обратную матрицу или вектор собственных значений), далее следует длительная обработка, касающаяся только второго массива. Ясно, что все время длительной обработки уже ненужный исходный массив matrix будет непродуктивно занимать большой объем памяти. Выход в такой ситуации - это явно дать знать сборщику мусора о том, что объект стал ненужным, выполнив в соответствующем месте оператор

matrix = null;
На GC полагайся, а сам не плошай. ну и перекрестными ссылками не нужно его утруждать.

Цитата Сообщение от lavan Посмотреть сообщение
я внимателен,а вот вы путаетесь в понятиях и определениях это наверно от того,что где то, что то, слышали но вникать не стали.
это вы тут про анонимные ссылки вещали, а мои определения еще никто здесь не опроверг, только вы постоянно пересказываете. я вам говорю те понятия с которыми программисты работают, а не jvm.

Цитата Сообщение от lavan Посмотреть сообщение
создание объекта и возвращение ссылки на него, выполнит jvm. а теперь мы работаем с ссылкой
та понятно что все делает jvm, ну еще компилятор, а мы только код пишем раз уж на то пошло.
мы работаем с объектом посредством ссылки, водитель водит автомобиль посредством руля, летчик управляет самолетом посредством штурвала. что тут не ясно?

Цитата Сообщение от lavan Посмотреть сообщение
вы спросили
я вас не спрашивал, вы просто пересказали мои слова.

Добавлено через 7 минут
Цитата Сообщение от lavan Посмотреть сообщение
и я вам уже третий день объясняю где она здесь!
спросите любого джависта что здесь происходит, все скажут "создается объект и вызывается метод у объекта", а не "создается ссылка и вызывается метод у ссылки", потому что объект наше все. раз мы создаем объекты и вызываем методы объектов, значит работаем мы с объектами, а с чем работает jvm это уже совсем другой вопрос. и именно об объектах мы говорим в профессиональной терминологии, а свои низкоуровневые понятия оставьте сишникам/асемлеривщикам.

Добавлено через 1 час 2 минуты
Цитата Сообщение от lavan Посмотреть сообщение
здесь JVM скрывает от вас '='
даже не знаю. зачем JVM'е здесь что-то чему-то присваивать?
Цитата Сообщение от lavan Посмотреть сообщение
и я вам уже третий день объясняю где она здесь!
да вы просто выделите в этом куске кода, раз уж мы обсуждаем о том, с чем мы работаем, лично я вижу здесь оператор new(оператор создания объекта), конструктор по умолчанию и вызов метода, а вот ссылок не вижу. то, чего мы не видим, с тем мы и не работаем, JVM возможно, но не мы.
в общем JVM работает в рантайме, но мы же работаем с кодом, здесь разговор идет о написании кода.

Добавлено через 24 минуты

Не по теме:

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

Yandex
Объявления
09.11.2013, 22:17     this в Java
Закрытая тема Создать тему
Опции темы

Текущее время: 23:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru