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

Как объявить статический класс? - Программирование Android

14.08.2015, 16:43. Просмотров 1435. Ответов 20
Метки нет (Все метки)

В Android Studio заметил интересную вещь, есть некий класс (AlertDialog.Builder), объявлен как static, но в то же время можно создавать его экземпляр. Как такое может быть? Я знаком со статическими полями, методами, а вот можно ли объявлять весь класс статическим? Пробовал сделать это в Eclipse-подчеркивает красным, не дает. Помогите пожалуйста разобраться
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2015, 16:43
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как объявить статический класс? (Программирование Android):

Как объявить ImageButton в Fragment.java?
Помогите пожалуйста!Есть Fragment как правильно объявить ImageButton,что бы по...

Как объявить переменную в Андроид Студио?
Не кидайте тапками, если вопрос сильно глупый) Осваиваю Андроид Студио по...

Статический listener
Всем привет! Немного затупил. Есть некий ListView, в котором хранятся...

Статический импорт в Android
Когда я пишу, например, import static java.lang.Math.abs - все работает и все...

Как правильно объявить статический метод
например class A { private: static void method(); //...

Как объявить статический метод класса?
выдает ошибку на 11 16 19 строку((((((( #include <iostream> using...

20
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
14.08.2015, 17:26 #2
danek130995, http://stackoverflow.com/a/7486111
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
14.08.2015, 20:48  [ТС] #3
Spelcrawler, я прочитал, это симуляция статического класса, но ведь тут нету самого идентификатора static в объявлении класса, класс просто называется public final class MyStaticClass. А в Android Studio есть явный пример- public static class Builder {...}
0
Spelcrawler
531 / 501 / 113
Регистрация: 12.03.2014
Сообщений: 1,666
Завершенные тесты: 1
14.08.2015, 22:02 #4
Java has no way of making a top-level class static
Можно сделать статичным только внутренний класс. Да и вообще не вижу смысла в статичном классе. Сделайте конструктор private и все методы static. Эффект тот же - создать экземпляр класса нельзя(разве что унаследоваться от него) и все методы доступны. Ну и поля тоже сделать static конечно.
1
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
14.08.2015, 22:02 #5
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

статическим может быть только внутренний класс.
нпрм:
Java
1
2
3
4
5
6
public class A {
 
static class B {
}
 
}
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
14.08.2015, 22:09  [ТС] #6
Spelcrawler, Netscape, а вот в чем дело, только внутренний класс.. Спасибо! Хотя смысла не вижу в нем
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
15.08.2015, 00:29 #7
Смысл в том, что его экземпляр не имеет ссылку на внешний класс(при создании)
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
15.08.2015, 09:56  [ТС] #8
Mikalai, извините, не совсем понятно. Так всегда вроде только переменная супер класса может ссылаться на объект подкласса, как понять экземпляр не имеет ссылку на внешний класс? Или вы имеете ввиду на любой другой внешний класс?
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
15.08.2015, 10:53 #9
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Вложенный нестатический класс – это класс, который объявлен как нестатический член окружающего класса. Если статический вложенный класс принадлежал всему классу, то нестатический вложенный класс всегда связан с конкретным экземпляром окружающего класса.
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
15.08.2015, 12:20  [ТС] #10
Mikalai, это теперь понятно. Но я сейчас попытался в Eclipse создать экземпляр вложенного нестатического класса-у меня не получилось, а создать экземпляр вложенного статического-получилось, странно.
Java
1
2
3
4
5
public class mememe {
class me2{
    
}
}
Java
1
2
3
4
5
public class Counter {
public static void main(String args[]){
    mememe.me2 mc=new mememe.me2();
}
}
Подчеркивает красным последнюю строчку.

Если же me2 объявить как static, то работает. Почему так?
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
15.08.2015, 12:36 #11
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Описываем внутренний класс
Java
1
2
3
public class Second {
    class Third {}
}
Создаём экземпляр
Java
1
2
3
4
5
public class First {
    public static void main(String[] args){
        Second.Third third = new Second().new Third();
    }
}
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
15.08.2015, 13:14  [ТС] #12
Mikalai, точно, забыл еще один new. Спасибо! И как я понял, если бы Ваш класс Third был объявлен как static, то он принадлежал бы всему внешнему классу(т.е. к нему можно было бы обратиться из любого экземпляра и он был бы одним и тем же для всех экземпляров), а в данной ситуации Third принадлежит только экземпляру, ссылка на который-third, и для каждого экземпляра будет новый Third, правильно?
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
15.08.2015, 13:21 #13
Да. Это так.
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
15.08.2015, 13:35  [ТС] #14
Mikalai, опять вопрос появился - а ежели static класс един для всех экземпляров, зачем тогда создавать его экземпляр?
Java
1
mememe.me2 mc=new mememe.me2();
И чем тогда эта запись отличается от этой по смыслу?
Java
1
mememe mc=new mememe();
Добавлено через 5 минут
Mikalai, сейчас попробовал обратиться к переменной-члену класса me2 -в первом случае получилось, во втором ее не видит. Стало быть, во втором случае создается только экземпляр внешнего класса, и нельзя получить доступ к подклассу, а в первом случае создаются экземпляры обеих классов?
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
15.08.2015, 14:01 #15
Почитай тут
1
Pablito
2652 / 2134 / 726
Регистрация: 12.05.2014
Сообщений: 7,448
Завершенные тесты: 1
15.08.2015, 17:07 #16
а еще тут
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
15.08.2015, 17:10  [ТС] #17
Mikalai, почитал. Сейчас объявил два экземпляра статического класса- и в одном из них изменил значение переменной-члена. Судя по тому, что класс "статичен", значение переменной должно было поменяться и в другом "экземпляре", но оно почему то не поменялось.. Странно
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
15.08.2015, 18:15 #18
danek130995, StaticNestedClass и singleton - это разные вещи. StaticNestedClass просто не привязан к конкретному объекту его обрамляющего класса(OuterClass). Но это не значит, что у него существует только один экземпляр(для этого используют шаблон проектирования singleton). Вот тут можно прочитать про то, что StaticNestedClass ведёт себя как top-level class, который был вложен в другой класс верхнего уровня для удобства упаковки(packaging convenience).
1
danek130995
24 / 24 / 1
Регистрация: 25.05.2014
Сообщений: 949
15.08.2015, 21:55  [ТС] #19
Mikalai, что то я потерялся, мне кажется я совсем понимаю вот что: что вы имееете ввиду под
Цитата Сообщение от Mikalai Посмотреть сообщение
не привязан к конкретному объекту его обрамляющего класса
Можете привести пример, как понять привязан/не привязан?
0
Mikalai
262 / 238 / 95
Регистрация: 11.01.2015
Сообщений: 666
15.08.2015, 23:26 #20
Статический внутренний класс должен обращаться к нестатическим членам своего внешнего класса при помощи объекта, т.е. он не может обращаться напрямую на нестатические члены своего внешнего класса(тоесть объект внемшего класса не создаётся)

Внутренний класс(non-static) имеет доступ ко всем переменным и методам своего внешнего класса и может непосредственно ссылаться на них(значит объект внешнего класса создаётся и существует, как минимум, пока существует объект внутреннего класса). Если вам понадобится получить ссылку на объект внешнего класса, запишите имя внешнего класса, за которым следует точка, а затем ключевое слово this.

information
2
15.08.2015, 23:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2015, 23:26
Привет! Вот еще темы с решениями:

Как лучше объявить статический список или массив
Добрый день! Задача банальная, но не могу сообразить. Вообще есть ряд чисел...

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

Почему нельзя объявить в описание класса статический double?
Ближе к делу :) class SuperClass { public: SuperClass() {} static...

Статический класс как уровень доступа к БД
Внутри класса реализуются члены доступа к локальной БД, в основном все основано...


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

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

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