Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
1

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

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

Author24 — интернет-сервис помощи студентам
В Android Studio заметил интересную вещь, есть некий класс (AlertDialog.Builder), объявлен как static, но в то же время можно создавать его экземпляр. Как такое может быть? Я знаком со статическими полями, методами, а вот можно ли объявлять весь класс статическим? Пробовал сделать это в Eclipse-подчеркивает красным, не дает. Помогите пожалуйста разобраться
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.08.2015, 16:43
Ответы с готовыми решениями:

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

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

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

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

20
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
14.08.2015, 17:26 2
danek130995, http://stackoverflow.com/a/7486111
1
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
14.08.2015, 20:48  [ТС] 3
Spelcrawler, я прочитал, это симуляция статического класса, но ведь тут нету самого идентификатора static в объявлении класса, класс просто называется public final class MyStaticClass. А в Android Studio есть явный пример- public static class Builder {...}
0
535 / 504 / 114
Регистрация: 12.03.2014
Сообщений: 1,671
14.08.2015, 22:02 4
Java has no way of making a top-level class static
Можно сделать статичным только внутренний класс. Да и вообще не вижу смысла в статичном классе. Сделайте конструктор private и все методы static. Эффект тот же - создать экземпляр класса нельзя(разве что унаследоваться от него) и все методы доступны. Ну и поля тоже сделать static конечно.
1
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
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
14.08.2015, 22:09  [ТС] 6
Spelcrawler, Netscape, а вот в чем дело, только внутренний класс.. Спасибо! Хотя смысла не вижу в нем
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
15.08.2015, 00:29 7
Смысл в том, что его экземпляр не имеет ссылку на внешний класс(при создании)
1
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
15.08.2015, 09:56  [ТС] 8
Mikalai, извините, не совсем понятно. Так всегда вроде только переменная супер класса может ссылаться на объект подкласса, как понять экземпляр не имеет ссылку на внешний класс? Или вы имеете ввиду на любой другой внешний класс?
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
15.08.2015, 10:53 9
Лучший ответ Сообщение было отмечено danek130995 как решение

Решение

Вложенный нестатический класс – это класс, который объявлен как нестатический член окружающего класса. Если статический вложенный класс принадлежал всему классу, то нестатический вложенный класс всегда связан с конкретным экземпляром окружающего класса.
1
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
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
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
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
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
15.08.2015, 13:14  [ТС] 12
Mikalai, точно, забыл еще один new. Спасибо! И как я понял, если бы Ваш класс Third был объявлен как static, то он принадлежал бы всему внешнему классу(т.е. к нему можно было бы обратиться из любого экземпляра и он был бы одним и тем же для всех экземпляров), а в данной ситуации Third принадлежит только экземпляру, ссылка на который-third, и для каждого экземпляра будет новый Third, правильно?
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
15.08.2015, 13:21 13
Да. Это так.
1
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
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
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
15.08.2015, 14:01 15
Почитай тут
1
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
15.08.2015, 17:07 16
а еще тут
1
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
15.08.2015, 17:10  [ТС] 17
Mikalai, почитал. Сейчас объявил два экземпляра статического класса- и в одном из них изменил значение переменной-члена. Судя по тому, что класс "статичен", значение переменной должно было поменяться и в другом "экземпляре", но оно почему то не поменялось.. Странно
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
15.08.2015, 18:15 18
danek130995, StaticNestedClass и singleton - это разные вещи. StaticNestedClass просто не привязан к конкретному объекту его обрамляющего класса(OuterClass). Но это не значит, что у него существует только один экземпляр(для этого используют шаблон проектирования singleton). Вот тут можно прочитать про то, что StaticNestedClass ведёт себя как top-level class, который был вложен в другой класс верхнего уровня для удобства упаковки(packaging convenience).
1
32 / 32 / 3
Регистрация: 25.05.2014
Сообщений: 1,137
15.08.2015, 21:55  [ТС] 19
Mikalai, что то я потерялся, мне кажется я совсем понимаю вот что: что вы имееете ввиду под
Цитата Сообщение от Mikalai Посмотреть сообщение
не привязан к конкретному объекту его обрамляющего класса
Можете привести пример, как понять привязан/не привязан?
0
266 / 242 / 96
Регистрация: 11.01.2015
Сообщений: 673
15.08.2015, 23:26 20
Статический внутренний класс должен обращаться к нестатическим членам своего внешнего класса при помощи объекта, т.е. он не может обращаться напрямую на нестатические члены своего внешнего класса(тоесть объект внемшего класса не создаётся)

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

information
2
15.08.2015, 23:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.08.2015, 23:26
Помогаю со студенческими работами здесь

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

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

Объявить статический массив размерности 20. Заполнить его «случайным образом»...
Задача 2. Объявить статический массив размерности 20. Заполнить его «случайным образом»....

Как преобразовать приведенный код в статический класс
Всем день добрый, и заранее спасибо. Суть проблемы: есть код: namespace LabComp_3 { class...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru