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

Как объявить статический класс? - Android

Восстановить пароль Регистрация
 
 
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
14.08.2015, 16:43     Как объявить статический класс? #1
В Android Studio заметил интересную вещь, есть некий класс (AlertDialog.Builder), объявлен как static, но в то же время можно создавать его экземпляр. Как такое может быть? Я знаком со статическими полями, методами, а вот можно ли объявлять весь класс статическим? Пробовал сделать это в Eclipse-подчеркивает красным, не дает. Помогите пожалуйста разобраться
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
14.08.2015, 17:26     Как объявить статический класс? #2
danek130995, http://stackoverflow.com/a/7486111
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
14.08.2015, 20:48  [ТС]     Как объявить статический класс? #3
Spelcrawler, я прочитал, это симуляция статического класса, но ведь тут нету самого идентификатора static в объявлении класса, класс просто называется public final class MyStaticClass. А в Android Studio есть явный пример- public static class Builder {...}
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
14.08.2015, 22:02     Как объявить статический класс? #4
Java has no way of making a top-level class static
Можно сделать статичным только внутренний класс. Да и вообще не вижу смысла в статичном классе. Сделайте конструктор private и все методы static. Эффект тот же - создать экземпляр класса нельзя(разве что унаследоваться от него) и все методы доступны. Ну и поля тоже сделать static конечно.
Netscape
 Аватар для Netscape
371 / 358 / 48
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
14.08.2015, 22:02     Как объявить статический класс? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
статическим может быть только внутренний класс.
нпрм:
Java
1
2
3
4
5
6
public class A {
 
static class B {
}
 
}
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
14.08.2015, 22:09  [ТС]     Как объявить статический класс? #6
Spelcrawler, Netscape, а вот в чем дело, только внутренний класс.. Спасибо! Хотя смысла не вижу в нем
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
15.08.2015, 00:29     Как объявить статический класс? #7
Смысл в том, что его экземпляр не имеет ссылку на внешний класс(при создании)
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
15.08.2015, 09:56  [ТС]     Как объявить статический класс? #8
Mikalai, извините, не совсем понятно. Так всегда вроде только переменная супер класса может ссылаться на объект подкласса, как понять экземпляр не имеет ссылку на внешний класс? Или вы имеете ввиду на любой другой внешний класс?
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
15.08.2015, 10:53     Как объявить статический класс? #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вложенный нестатический класс – это класс, который объявлен как нестатический член окружающего класса. Если статический вложенный класс принадлежал всему классу, то нестатический вложенный класс всегда связан с конкретным экземпляром окружающего класса.
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
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, то работает. Почему так?
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
15.08.2015, 12:36     Как объявить статический класс? #11
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Описываем внутренний класс
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();
    }
}
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
15.08.2015, 13:14  [ТС]     Как объявить статический класс? #12
Mikalai, точно, забыл еще один new. Спасибо! И как я понял, если бы Ваш класс Third был объявлен как static, то он принадлежал бы всему внешнему классу(т.е. к нему можно было бы обратиться из любого экземпляра и он был бы одним и тем же для всех экземпляров), а в данной ситуации Third принадлежит только экземпляру, ссылка на который-third, и для каждого экземпляра будет новый Third, правильно?
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
15.08.2015, 13:21     Как объявить статический класс? #13
Да. Это так.
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
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 -в первом случае получилось, во втором ее не видит. Стало быть, во втором случае создается только экземпляр внешнего класса, и нельзя получить доступ к подклассу, а в первом случае создаются экземпляры обеих классов?
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
15.08.2015, 14:01     Как объявить статический класс? #15
Почитай тут
Паблито
не спать!
1881 / 1615 / 500
Регистрация: 12.05.2014
Сообщений: 5,831
Завершенные тесты: 1
15.08.2015, 17:07     Как объявить статический класс? #16
а еще тут
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
15.08.2015, 17:10  [ТС]     Как объявить статический класс? #17
Mikalai, почитал. Сейчас объявил два экземпляра статического класса- и в одном из них изменил значение переменной-члена. Судя по тому, что класс "статичен", значение переменной должно было поменяться и в другом "экземпляре", но оно почему то не поменялось.. Странно
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
15.08.2015, 18:15     Как объявить статический класс? #18
danek130995, StaticNestedClass и singleton - это разные вещи. StaticNestedClass просто не привязан к конкретному объекту его обрамляющего класса(OuterClass). Но это не значит, что у него существует только один экземпляр(для этого используют шаблон проектирования singleton). Вот тут можно прочитать про то, что StaticNestedClass ведёт себя как top-level class, который был вложен в другой класс верхнего уровня для удобства упаковки(packaging convenience).
danek130995
 Аватар для danek130995
23 / 23 / 1
Регистрация: 25.05.2014
Сообщений: 819
15.08.2015, 21:55  [ТС]     Как объявить статический класс? #19
Mikalai, что то я потерялся, мне кажется я совсем понимаю вот что: что вы имееете ввиду под
Цитата Сообщение от Mikalai Посмотреть сообщение
не привязан к конкретному объекту его обрамляющего класса
Можете привести пример, как понять привязан/не привязан?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.08.2015, 23:26     Как объявить статический класс?
Еще ссылки по теме:

Android Как объявить переменную в Андроид Студио?
Как наследовать класс activity Android
Android Статический импорт в Android
Android Как объявить ImageButton в Fragment.java?
Android Статический listener

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

Или воспользуйтесь поиском по форуму:
Mikalai
248 / 224 / 91
Регистрация: 11.01.2015
Сообщений: 643
15.08.2015, 23:26     Как объявить статический класс? #20
Статический внутренний класс должен обращаться к нестатическим членам своего внешнего класса при помощи объекта, т.е. он не может обращаться напрямую на нестатические члены своего внешнего класса(тоесть объект внемшего класса не создаётся)

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

information
Yandex
Объявления
15.08.2015, 23:26     Как объявить статический класс?
Ответ Создать тему
Опции темы

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