Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
#1

Объект, реализующий интерфейс

17.08.2015, 18:53. Просмотров 994. Ответов 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
Ответы с готовыми решениями:

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

Класс, реализующий интерфейс Iterator, в PHP 7
Доброе утро. Делаю задание и честно говоря не до конца понимаю как сделать,...

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

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

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

14
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 668
17.08.2015, 19:48 #2
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Ты же на днях про это спрашивал уже. для создания экземпляра внутреннего класса(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
Сообщений: 949
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
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 668
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
Сообщений: 949
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
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 668
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
Сообщений: 949
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
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 668
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
Сообщений: 949
18.08.2015, 11:00  [ТС] #9
Mikalai, ну тут в данном случае second до обнуления и после будут совпадать, правильно? Объект то один и тот же.
На счет плюсов-я просто очень благодарен Вам
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 668
18.08.2015, 11:18 #10
Да. Объект один и тот же.
0
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
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
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 668
18.08.2015, 11:51 #12
Да. так всё и есть.
0
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
18.08.2015, 12:26  [ТС] #13
Mikalai, так почему в случае ref3 все же создается-new Test()., а также создается и экземпляр new Nested2(), если должна быть возможность обратиться к данному полю без создания экземпляра Test?
0
Mikalai
264 / 240 / 95
Регистрация: 11.01.2015
Сообщений: 668
18.08.2015, 13:49 #14
Имеется ввиду, что ты из внешнего кода можешь обратиться к этому полю не создавая экземпляр класса в котором это поле описано. А как инициализируется это поле - это уже другая история и она звучит так: если ты хочешь создать экземпляр внутреннего(non-static) класса, то придётся создавать экземпляр внешнего класса.

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

Написать класс сравнения чисел, реализующий интерфейс срвнения iComparer<int>
Задача : Написать класс сравнения чисел, реализующий интерфейс сравнения...

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

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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