В чем ошибка? (non-static method cannot be referenced...)

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

В чем ошибка? (non-static method cannot be referenced...)

Сообщение djdance » 12 янв 2013, 01:52

Не понимаю. Вот сервис1 и вот класс1. Пытаюсь в классе1 взять getApplicationContext.
Во-первых, его там нет (как быть?). Ладно, делаю паблик запрос через сервис1.
И компилер ругается

java: non-static method getContext() cannot be referenced from a static context
что я делаю не так?


вот код обоих:

Код: Выделить всё

public class сервис1 extends Service {
...
    public Context getContext() {
        return getApplicationContext();
    }

--------------------------------
public class класс1 {
...
    void работа(){
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(сервис1.getContext());
а если сделать getContext() статиком, то ругается

java: non-static method getApplicationContext() cannot be referenced from a static context

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение Finch » 12 янв 2013, 03:48

Типичная ошибка начинающего =) Подсказыть не стану ты сам должен понять =)
CEO of a company R.id.team

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение djdance » 12 янв 2013, 14:26

а зачэм тогда форум? я не смог, не просто же так пришёл :)

public функцию из класса -> в активити вызывал.
а тут не получается
это какие-то ограничения на направления? о_0

опять же делаю иногда скажем переменную паблик - а снаружи её не видно, или видно, но нулл.
че за такое. Паблик не паблик? Как перекидывать переменные - через преференции неудобно.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение rezak90 » 12 янв 2013, 15:29

он имеет в виду (и я с ним согласен) в том что вам нужно начать с основ java если задаетесь такими вопросами (особенно "делаю иногда скажем переменную паблик - а снаружи её не видно, или видно, но нулл.").
R.id.team
Политика на форуме запрещена

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение Finch » 12 янв 2013, 16:16

djdance писал(а):а зачэм тогда форум? я не смог, не просто же так пришёл :)

public функцию из класса -> в активити вызывал.
а тут не получается
это какие-то ограничения на направления? о_0

опять же делаю иногда скажем переменную паблик - а снаружи её не видно, или видно, но нулл.
че за такое. Паблик не паблик? Как перекидывать переменные - через преференции неудобно.
Обращаться к полям на прямую - правило дурного тона. Существует инкапсуляция.

У тебя есть класс, в нём есть поля, обращаться к ним нужно через геттеры и сеттеры

Код: Выделить всё

public class User {
    private String mName = "Вася Пупкин";
    private String[] mNames;
    
    //Тут не будет NullPointerException
    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }

    //А тут будет NullPointerException, знаешь почему? Уверен что у тебя такие же ошибки, когда твои паблик переменные возвращают null
    public String[] getNames() {
        return mNames;
    }
}
П.С. а форум затем чтоб не учить основам языка, а помогать решить какие-то задачи или подводные камни ;)
Тебе нужно выучить основы Java и тогда твои ошибки пропадут сами собой =)
CEO of a company R.id.team

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение neoksi » 12 янв 2013, 16:28

Солидарен с коллегами по цеху, просто дать ответ тут нельзя. Нужно, чтоб вы сами понимали, чем статичные данные отличаются от динамических. Могу дать одну подсказку, почитайте о singleton в java.

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение Finch » 12 янв 2013, 16:33

И больше того, я тебе дам ссыль на русскоязычную статью с хорошим объяснением + и - разных реализаций паттерна singleton =)
П.С. разве это не чудо иметь такой форум в своей обойме? =)
CEO of a company R.id.team

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение djdance » 12 янв 2013, 16:49

старенький я уже, чтобы с основ седьмой синтаксис изучать... и это не от лени.

спасибо neoksi, я примерно понимаю про один экземпляр класса и причину появления null. Примерно вижу, как это заворачивают, да. Мне надо понять, всегда ли так работать, или классы все-таки могут шарить переменные по-простому.

спасибо Finch, я знаю про инкапсуляцию, и даже сделал ее (в нулевом посте она же?) - getContext().
И моё непонимание как раз в том, что компилер ругается на нон-паблик независимо от оформления функции.

Смотрите, поменял в сервисе1 ответ функции на нулл:
public Context getContext() {
return null;//getApplicationContext();
}

При этом в классе1 вызов остался такой:
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(сервис1.getContext());

Компилер все равно говорит:
java: non-static method getContext() cannot be referenced from a static context

То есть я бы понял, если бы сервис1 вызывал класс1 и пытался из класса1 взять паблик.
Но у меня же наоборот. Используемый класс1 пытается забрать данные из сервиса1 (родительского).
Что же мне, и родителя обёртывать в инстанс? Непонятно.

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение Finch » 12 янв 2013, 17:18

Лады ленивец, держи намёк на понимание

Код: Выделить всё

private static Context mContext;
	
	public сервис1() {
		mContext = getApplicationContext();
	}
	
	public static Context getContext(){
		return mContext;
	}
ток скажи можно ли так делать?)
CEO of a company R.id.team

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение djdance » 12 янв 2013, 17:49

Finch,

да, я тоже к этому пришел. Или делать сеттер в классе1. Работает, спасибо. Не знаю, почему нельзя так делать.

Но - зачем нужно определение ПЕРЕМЕННОЙ областью видимости "паблик", если она не видна и вообще "дурной тон"?

Вот в статьях по синглетону есть пример оборачивания на дельфи. Смешно, но там такой метод излишен - если переменная типа паблик, она ВСЕГДА видна. Да, тоже в общем дурной тон её дергать напрямую. Но ситуация более однозначна, чем в джаве. Зачем же тут нужен "паблик" для переменных?

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение djdance » 12 янв 2013, 19:20

вот эта статья мне помогла сейчас.

http://ru-code-android.livejournal.com/4594.html

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение KamiSempai » 12 янв 2013, 23:05

djdance, Вы не понимаете разницы между объектом и классом объекта. Задумайтесь над этим.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение djdance » 12 янв 2013, 23:34

KamiSempai

класс - абстракция, объект - созданная из неё работающая структура.
это не даёт мне ответа на вопрос, ЗАЧЕМ нужен паблик для переменных, если их все равно нельзя брать.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение KamiSempai » 13 янв 2013, 11:21

djdance писал(а):класс - абстракция, объект - созданная из неё работающая структура.
это не даёт мне ответа на вопрос, ЗАЧЕМ нужен паблик для переменных, если их все равно нельзя брать.
Это делает код менее безопасным. Объект теряет контроль над своими переменными, в любой части кода ни могут быть изменены, даже за пределами этого объекта. Создание гетеров и сетеров помогает обработать ситуации которые могут привести к исключению. Например, если взять пример приведенный выше, где должно произойти обращение к нулл. Добавим в метод проверку на существование объекта и создание его в случает отсутствия. Все, теперь у нас ни кода не будет возвращен null. И не надо делать подобную проверку в других местах. В итоге меньше кода, меньше ошибок, больше здоровых нервов.

В некоторых ситуациях, конечно, подобная осторожность излишняя и ,кажется, чего там из за одной переменной 2 метода создавать, но подобные мысли могут войти в привычку и Вы будете лепить глобальные переменные где можно и где нельзя.

Запомните, глобальные переменные - это темная сторона силы, она облегчит вам путь к достижению цели, но она же вас и погубит. Настоящие джедаи ни кода не пользуются глобальными переменными.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение neoksi » 13 янв 2013, 13:40

KamiSempai писал(а):...
Запомните, глобальные переменные - это темная сторона силы, она облегчит вам путь к достижению цели, но она же вас и погубит. Настоящие джедаи ни кода не пользуются глобальными переменными.
Ох, почувствовал себя темным джедаем. Так как считаю использование глобальных переменных оправданным, к примеру для хранения языковой настройки.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение rezak90 » 13 янв 2013, 14:25

поддерживаю на счёт не использования глобальных, в андроиде на такой случай есть bundle который в свою очередь можно сделать singleton что в принципе часто и делается (это если не избежать прямой передачи из бандла в бандл, например: передать данные из фрагмента активти А в фрагмент активити Б).
R.id.team
Политика на форуме запрещена

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение Finch » 13 янв 2013, 17:35

Не вижу ничего плохого в глобалках если использовать их с умом, там где есть необходимость и если инкапсулировать их, ну а если использовать паблик глобалки то только константы.
CEO of a company R.id.team

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение Mikhail_dev » 13 янв 2013, 19:53

Нередко использую глобальные переменные. getInstance() генерирует что-либо, парсит к примеру конфиг, дает значения переменным и после можно спокойно работать. Это так называемый ребут приложения, когда поправили настройки запуска. Другое дело, что они должны быть приватными

djdance
Сообщения: 48
Зарегистрирован: 04 дек 2012, 15:33

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение djdance » 14 янв 2013, 01:49

стоп-стоп-стоп, товарищи, вопрос я ставлю - извините, в третий раз - именно так:

зачем нужны ПАБЛИК переменные? зачем писать publict static mVar, если мы этим пабликом никогда не пользуемся, а работаем через геттеры и сеттеры.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: В чем ошибка? (non-static method cannot be referenced...

Сообщение rezak90 » 14 янв 2013, 02:21

потому что в первую очередь запись "publict static mVar" чревато утечкой памяти
R.id.team
Политика на форуме запрещена

Ответить