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

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

Войти
Регистрация
Восстановить пароль
 
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
#1

Объект, реализующий интерфейс - Программирование Android

17.08.2015, 18:53. Просмотров 418. Ответов 14
Метки нет (Все метки)

Добавлено через 5 минут
Есть, например, интерфейс Parcelable.Creator. В Android Studio, для того, чтобы объявить объект , реализующий данный интерфейс, используется конструкция:
Java
1
2
3
4
5
6
7
8
9
10
11
    
public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
         распаковываем объект из Parcel
   public MyObject createFromParcel(Parcel in) {
            Log.d(LOG_TAG, "createFromParcel");
            return new MyObject(in);
        }
        public MyObject[] newArray(int size) {
            return new MyObject[size];
        }
    };
Я захотел сделать по старинке-я создал класс A, который реализует интерфейс Parcelable.Creator:
Java
1
2
3
4
5
6
7
8
9
10
 public class A implements Parcelable.Creator<MyObject>{
 
        public MyObject createFromParcel(Parcel in) {
            Log.d(LOG_TAG, "createFromParcel");
          return new MyObject(in);
        }
        public MyObject[] newArray(int size){
            return new MyObject[size];
        }
    }
Далее я хочу объявить переменную этого класса CREATOR аналогично объявлению в первом случае:
Java
1
public static final  A CREATOR= new A();
Но у меня подсвечивается красным newA() и написано, что MyObject.this cannot be referenced from a static context. Объясните пожалуйста, что это значит? И почему в первом случае можно объявлять каким то образом экземпляр класса, реализующий интерфейс, при этом не указывая сам класс, а указывая лишь ссылку на него:CREATOR, а во втором случае, как учит Герберт Шилдт, нельзя? Кстати, если убрать static, то получается во втором случае. Почему в первом случае static можно указать, а во втором нельзя? Спасибо заранее, надеюсь доступно объяснил вопрос.

Добавлено через 14 минут
Если же класс A создать отдельно, не вложенным в класс MyObject, то все хорошо, почему так?

Добавлено через 6 минут
Может быть нельзя создать переменную экземпляра вложенного класса статичной?

Свел все к минимому:
почему данная конструкция не допустима?
Java
1
2
3
4
5
6
7
8
package others;
 
public class Nested {
class nested2{
    
}
static nested2 a=new nested2();
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2015, 18:53     Объект, реализующий интерфейс
Посмотрите здесь:

импортировать интерфейс - Программирование Android
как в Exlipce импортировать интерфейс по ссылке ?

Дисковый интерфейс - Программирование Android
Или не знаю, как это называется. Но нужно запилить мини-игру: имеем круг и два кольца (вместе образуют один круг, то есть сначала в...

Android интерфейс - Программирование Android
Всем доброго дня! Я начинающий в разработке под андроид. Есть необходимость создавать различные элементы. Кнопки с разрешение для...

Интерфейс не на весь экран - Программирование Android
Во всех статья по программированию андроид, которые я нашел все начинается с создания activity, далее helloworld и продолжается долгими...

Как подзаморозить интерфейс? - Программирование Android
Здравствуйте! Пытаюсь загрузить список ListView из базы. В списке примерно 20 строк. Если делаю это в UI-потоке, то всё грузится меньше...

Динамический интерфейс, восстановление Activity - Программирование Android
Как восстановить переменную при возврате в активность.(варианты с записью в файл или БД пока не рассматриваются, интересен базовый...

[Swipe, Fragment] - интерфейс как у маркета - Программирование Android
Приветствую, которую неделю туплю и не могу сделать интерфейс как у маркета. Задача, сделать интерфейс, чтобы жестом пальца можно было...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
17.08.2015, 19:48     Объект, реализующий интерфейс #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ты же на днях про это спрашивал уже. для создания экземпляра внутреннего класса(non-static) нужен экземпляр внешнего класса.

Java
1
2
3
4
5
6
7
public class Test {
 
    class Nested2{
 
    }
    static Nested2 a = new Test().new Nested2();
}
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
17.08.2015, 20:15  [ТС]     Объект, реализующий интерфейс #3
Mikalai, Mikalai, да, вы абсолютно правы, спасибо, забыл про это, просто голова кругом идет от 12 часового изучения андроида)
P.S. почему тогда если я уберу слово static перед объявлением переменной A, то данная конструкция не подчеркивается красным?
Java
1
 public  final  A CREATOR= new A();
Ведь здесь же все равно создается экземпляр внутреннего класса.

Добавлено через 2 минуты
ув. Mikalai, и еще вопрос: получается конструкции вроде этой
Java
1
public static final Parcelable.Creator<MyObject> CREATOR = new Parcelable.Creator<MyObject>() {
неявно создают класс, реализующий данный интерфейс, но с учетом того, что сам класс нам не нужен, а нужны только методы данного интерфейса, мы используем данную укороченную запись, не определяя имя класса, но создавая его объект?

Добавлено через 3 минуты
Mikalai, и еще вопрос:вы как то говорили, что для того, чтобы получить ссылку на текущий экземпляр внешнего класса, я могу использовать конструкцию MyObject.this. Например я не хочу создавать новый экземпляр MyObject чтобы создать экземпляр внутреннего класса A, а хочу обратиться к текущему. Почему сейчас это не работает:
Java
1
public static final  A CREATOR= MyObject.this.new A();
Кстати, работает последнее, если опять же убрать static перед A.

Добавлено через 5 минут
Mikalai, Сейчас проверил в эклипс-данная конструкция допустима для создания экземпляра внутреннего класса a1, если его переменная не объявлена как static:
Java
1
2
3
4
5
6
7
public class Nested {
    
class nested2{
}
static nested2 a=new Nested().new nested2();
 nested2 a1 =new nested2();
}
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
17.08.2015, 20:20     Объект, реализующий интерфейс #4
В этом случае
Java
1
2
3
4
5
6
7
public class Test {
 
    class Nested2{
 
    }
    Nested2 ref = new Nested2();
}
ref является частью объекта внешнего класса. И следовательно без создания экземпляра внешнего класса экземпляр внутреннего создаваться не будет.
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
17.08.2015, 21:39  [ТС]     Объект, реализующий интерфейс #5
Mikalai, т.е. при создании экземпляра Test создастся экземпляр внутреннего класса, а в случае с nested 2 при создании экземпляра Nested создастся еще один экземпляр Nested и внутри него уже nested2? (
Java
1
nested2 a=new Nested().new nested2();
)

Добавлено через 58 минут
Mikalai, так почему static перед объявлением переменной далает невозможной запись
Java
1
static Nested2 ref = new Nested2();
И почему также он делает невозможным и эту запись?
Java
1
public static final  A CREATOR= MyObject.this.new A();
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
17.08.2015, 21:56     Объект, реализующий интерфейс #6
Статические методы/свойства классов это такие методы/свойства, к которым можно обратиться не создавая объект данного класса. Прибавим к этому то, что для создания экземпляра внутреннего класса(non-static) нужен экземпляр внешнего класса. и получаем следующую картину:

Java
1
2
3
4
5
6
7
public class Test {
    class Nested2{
    }
    Nested2 ref1 = new Nested2();  // ok
    static Nested2 ref2 = new Nested2(); // error
    static Nested2 ref3 = new Test().new Nested2();  // ok
}
Лучше объяснить я не смогу )))

А про запись - public static final A CREATOR= MyObject.this.new A(); - я не понял
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
18.08.2015, 00:09  [ТС]     Объект, реализующий интерфейс #7
Mikalai, под этой записью я имел ввиду:вы как то говорили, что для того, чтобы получить ссылку на текущий экземпляр внешнего класса, я могу использовать конструкцию MyObject.this. Например я не хочу создавать новый экземпляр MyObject чтобы создать экземпляр внутреннего класса A, а хочу обратиться к текущему. Почему сейчас это не работает: public static final A CREATOR= MyObject.this.new A(); но работает вот это:
public final A CREATOR= MyObject.this.new A();
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
18.08.2015, 00:40     Объект, реализующий интерфейс #8
Так можно получить ссылку на объект внешнего класса только из внутреннего класса. А для того что бы создать объект внутреннего класса нам изначально понадобится создать объект внешнего класса.

Java
1
2
3
4
5
6
7
public class Second {
    class Third {
        public Second getSecondInstance() {
            return Second.this;
        }
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class First {
    public static void main(String[] args) {
        //создаём объект внешнего класса
        Second second = new Second();
        //создаём объект внутреннего класса
        Second.Third third = second.new Third();
        //обнулим ссылку на объект внешнего класса
        second = null;
        //тут ссылки на объект внешнего класса у нас нет
        //получим ссылку на внешний класс
        second = third.getSecondInstance();
    } 
}
PS: не ставь мне плюсов пожалуйста. Ты уже плюсов мне до конца жизни наставил ))) я и так отвечу если что будет не понятно
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
18.08.2015, 11:00  [ТС]     Объект, реализующий интерфейс #9
Mikalai, ну тут в данном случае second до обнуления и после будут совпадать, правильно? Объект то один и тот же.
На счет плюсов-я просто очень благодарен Вам
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
18.08.2015, 11:18     Объект, реализующий интерфейс #10
Да. Объект один и тот же.
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
18.08.2015, 11:31  [ТС]     Объект, реализующий интерфейс #11
Mikalai, я почти все понял благодаря Вам, спасибо! Осталась лишь пара моментов на счет вашего 6 сообщения
Цитата Сообщение от Mikalai Посмотреть сообщение
public class Test {
class Nested2{
}
Nested2 ref1 = new Nested2(); *// ok
static Nested2 ref2 = new Nested2(); // error
static Nested2 ref3 = new Test().new Nested2(); *// ok
}
До меня почему то никак не дойдет, почему мы в первой строчке можем объявить экземпляр ref1 класса Nested2, а как только припишем слово static-уже не можем? А в третьей сточке нам слово static не мешает создать экземпляр вложенного класса. Почему?
Я стараюсь рассуждать так-исправьте меня пожалуйста, если я где-то не прав.
1) В случае ref1-при создании экземпляра Test пользователь будет иметь возможность обратиться к полю ref1, и оно будет являться ссылкой на экземпляр класса Nested2, который был создан автоматически при создании экземпляра Test.
2) В случае ref2-так как мы объявили данное поле static, то пользователь должен иметь возможность обратиться к данному полю, не создавая экземпляр класса Test, но это невозможно, так как для создания экземпляра внутреннего класса нужен экземпляр внешнего.
3)В случае ref3 -так как мы объявили данное поле static, то пользователь должен иметь возможность обратиться к данному полю без создания экземпляра Test, но тут мы видим, что экземпляр Test все же создается-new Test()., а также создается и экземпляр new Nested2(). Вот данный момент мне не ясен.
Поправьте меня пожалуйста, где ошибка в моих рассуждениях?
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
18.08.2015, 11:51     Объект, реализующий интерфейс #12
Да. так всё и есть.
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
18.08.2015, 12:26  [ТС]     Объект, реализующий интерфейс #13
Mikalai, так почему в случае ref3 все же создается-new Test()., а также создается и экземпляр new Nested2(), если должна быть возможность обратиться к данному полю без создания экземпляра Test?
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 651
18.08.2015, 13:49     Объект, реализующий интерфейс #14
Имеется ввиду, что ты из внешнего кода можешь обратиться к этому полю не создавая экземпляр класса в котором это поле описано. А как инициализируется это поле - это уже другая история и она звучит так: если ты хочешь создать экземпляр внутреннего(non-static) класса, то придётся создавать экземпляр внешнего класса.

Статические внутренние классы это тоже самое что 2 top-level класса рядом. Используется это редко и только для удобства понимания кода. Технической выгоды тут нету. Если я сам правильно понимаю
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2015, 16:40     Объект, реализующий интерфейс
Еще ссылки по теме:

Разный интерфейс для смартфонов и планшетов - Программирование Android
Добрый день! Подскажите как можно отследить и создать разные интерфейсы для планшетов и для смартфонов?

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

Дизайн: как задать программно интерфейс приложения? - Программирование Android
Здравствуйте. Расскажите мне пожалуйста как можно больше про дизайн приложений. Раньше я работал с css html и т.п. Мне...

Объект Context - Программирование Android
Проблема такая: Я создаю новый класс в отдельном файле для работыSQLite и в нем мне нужен Объект Context, если я наследую Activity ...

Записать объект в SharedPreferences - Программирование Android
Здравствуйте, всем. В приложении реализован свой класс сбора статистики. Есть ли какой-то простой способ сериализовать или...


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

Или воспользуйтесь поиском по форуму:
danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 850
18.08.2015, 16:40  [ТС]     Объект, реализующий интерфейс #15
Mikalai, оо, я кажется всё понял! Спасибо огромное! Хочу поставить Вам еще +, но вы запретили
Yandex
Объявления
18.08.2015, 16:40     Объект, реализующий интерфейс
Ответ Создать тему
Опции темы

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