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

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

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

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

17.08.2015, 18:53. Просмотров 431. Ответов 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();
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2015, 18:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объект, реализующий интерфейс (Программирование Android):

Класс контейнера, реализующий интерфейс - C++
Всем доброго времени суток. Возник вопрос по выполнению задания. Вот само задание: Необходимо разработать класс контейнера,...

Как работает метод CompareTo(), реализующий интерфейс - C#
Собственно,вот и сама программа. using System; using System.Collections; // Реализовать необобщенный вариант интерфейса IComparable. ...

MySQL Необходимо создать пользовательский интерфейс, реализующий поиск по БД - C#
Имеется БД на mySql Аптека. Поиск по таблице Препарат. Нужно на форме создать textBox, в который пишем название препарата, который ищем, и...

интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект - C++
Привет всем. Необходимо реализовать интерфейс, в методе которого создается объект типа IDictionary и возвращается ссылка на этот объект. Не...

Написать класс сравнения чисел, реализующий интерфейс срвнения iComparer<int> - C#
Задача : Написать класс сравнения чисел, реализующий интерфейс сравнения iComparer&lt;int&gt;, который сортирует числа следующим образом: ...

Статический метод Arrays.asList() не возвращает контейнер, реализующий интерфейс List, при двух одинаковых аргументах: - Java SE
import java.util.*; class Snow {} class Powder extends Snow {} class Crusty extends Snow {} public class foo { public...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
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();
}
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 873
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();
}
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
17.08.2015, 20:20 #4
В этом случае
Java
1
2
3
4
5
6
7
public class Test {
 
    class Nested2{
 
    }
    Nested2 ref = new Nested2();
}
ref является частью объекта внешнего класса. И следовательно без создания экземпляра внешнего класса экземпляр внутреннего создаваться не будет.
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 873
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();
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
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(); - я не понял
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 873
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();
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
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: не ставь мне плюсов пожалуйста. Ты уже плюсов мне до конца жизни наставил ))) я и так отвечу если что будет не понятно
0
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 873
18.08.2015, 11:00  [ТС] #9
Mikalai, ну тут в данном случае second до обнуления и после будут совпадать, правильно? Объект то один и тот же.
На счет плюсов-я просто очень благодарен Вам
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
18.08.2015, 11:18 #10
Да. Объект один и тот же.
0
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 873
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(). Вот данный момент мне не ясен.
Поправьте меня пожалуйста, где ошибка в моих рассуждениях?
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
18.08.2015, 11:51 #12
Да. так всё и есть.
0
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 873
18.08.2015, 12:26  [ТС] #13
Mikalai, так почему в случае ref3 все же создается-new Test()., а также создается и экземпляр new Nested2(), если должна быть возможность обратиться к данному полю без создания экземпляра Test?
0
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
18.08.2015, 13:49 #14
Имеется ввиду, что ты из внешнего кода можешь обратиться к этому полю не создавая экземпляр класса в котором это поле описано. А как инициализируется это поле - это уже другая история и она звучит так: если ты хочешь создать экземпляр внутреннего(non-static) класса, то придётся создавать экземпляр внешнего класса.

Статические внутренние классы это тоже самое что 2 top-level класса рядом. Используется это редко и только для удобства понимания кода. Технической выгоды тут нету. Если я сам правильно понимаю
0
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 873
18.08.2015, 16:40  [ТС] #15
Mikalai, оо, я кажется всё понял! Спасибо огромное! Хочу поставить Вам еще +, но вы запретили
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2015, 16:40
Привет! Вот еще темы с ответами:

InvalidCastException. Объект должен реализовывать интерфейс IConvertible - C#
Здравствуйте! Такая проблема: есть таблица в БД mysql, в ней ищу строку по значению id. Строку вроде находит, пытаюсь создать из этой...

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

Iptables, правила, перенаправляющие на интерфейс eth1 все пакеты, приходящие на интерфейс eth0 - Ubuntu Linux
Добрый день, подскажите, пожалуйста, как Iptables написать правила, перенаправляющие на интерфейс eth1 все пакеты, приходящие на интерфейс...

База данных "учебный план специальности". GUI. Графический интерфейс. Пользовательский интерфейс - Prolog
Всем привет. Свалилась на меня, значит, курсовая по прологу. Все бы ничего, да реализовать ее надо через графический интерфейс. На турбо...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.08.2015, 16:40
Ответ Создать тему
Опции темы

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