![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Christoph |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Вопрос достаточно просто, только изучаю Java
Создаю 2 пакета
в пакете р1 есть поле protected, и я получить к ней доступ из другого пакета при условии что, класс другого пакета будет подклассом, верно? мне пишет компилятор что переменнная i не видна в пакете p2. Или может что то я не так понял, спасибо! -------------------- ![]() |
||||
|
|||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Помните, что наследование в Java добавляет в класс-наследник все не-private члены класса-предка, кроме конструкторов. Правильное обращение в таком случае будет выглядеть как
Но даже в этом случае ваш код не скомпилируется: вы обращаетесь из статического метода (это метод класса) к переменной объекта (непонятно какого и есть ли он вообще). Чтобы объявить переменную класса, используйте модификатор static -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Это сделано специально, вот немного модифицированный второй класс:
Как видишь первый два присваивания к this и p2BLoj проходят, а к p1BLoj - нет. И так сделано чтобы избежать следующей ситуации: есть базовый класс A с protected переменной i, от него наследуется класс B, который использует переменную i, при этом произвольно менять значение переменной i нельзя, чтобы не испортить данные. А теперь мы создаем класс Z, который наследуется от A, определим в нем подобный метод и передадим туда экземпляр класса B. Если бы доступ был, то можно было бы произвольно изменить переменную i и нарушить целостность B. Теперь по поводу пакаджей, дело в том что protected переменная так же доступна и внутри пакаджа (это сделано, чтобы упорядочить модификаторы по строгости, и умолчальный модификатор был более строгим чем protected). И если оба класса находятся в одном пакадже, то доступ идет как package private переменной. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Samotnik |
|
|||
![]() Super star ! ![]() ![]() ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 7192 Регистрация: 4.11.2006 Где: Минск City Репутация: 8 Всего: 191 |
Christoph, ты можешь к ней (переменной i) обратиться через this и не из статического метода
|
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Теперь вот так будет правильно? получается что из статического метода можно вызывать только статические переменные, и методы, вы уж простите, но я вот хотел узнать что, для чего нужны статические методы, чтоб можно было вызывать без объекта? - это получается что это обычная функция? или же статическая переменная- как по мне это просто глобальная переменная которая доступна во всех подклассах.Может быть статические методы используются для чего то другого, спасибо -------------------- ![]() |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Вот цитата "из первых рук" и пример:
подробнее читайте тут или тут Это сообщение отредактировал(а) jk1 - 29.12.2009, 18:15 -------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| MaxPayneC |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 324 Регистрация: 18.2.2006 Репутация: 5 Всего: 9 |
Статические методы вызываются у класса, нестатические (также называемые instance-методы) - у экземпляра класса. Это нужно для того, что не всегда действия выполняются с сущностью, а иногда с классом этой сущности.
Из статических методов доступны только статические переменные класса, но обратное неверно - из инстанс-методов доступны и инстанс-переменные, и статические переменные. |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Спасибо за информацию буду читать
-------------------- ![]() |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Раз уж вы во всем разобрались, то объясните мне при чем тут статические переменные (я говорю про первый пример)?
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
ну чтоб что то делать в статическом методе надо использовать только статические переменные или статические методы
-------------------- ![]() |
|||
|
||||
| jk1 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Это не так, читайте внимательнее приведенные статьи. Из методов класса (статика) можно вызывать методы объекта (не статика), но для этого объект должен существовать. Вот пример:
-------------------- Opinions are like assholes — everybody has one |
||||
|
|||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
Ну вот существует реальный объект, но вызвать не могу -------------------- ![]() |
|||
|
||||
| jk1 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1168 Регистрация: 17.10.2008 Где: Санкт-Петербург Репутация: 40 Всего: 75 |
Унаследованный protected-метод будет доступен как метод объекта вызывающего класса:
Это сообщение отредактировал(а) jk1 - 30.12.2009, 09:06 -------------------- Opinions are like assholes — everybody has one |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Может уже пора внимательно посмотреть на первый пример, попробовать его скомпилировать и внимательно прочитать сообщение об ошибке?
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
| Christoph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 667 Регистрация: 23.1.2008 Где: Харьков Репутация: нет Всего: 11 |
немного не улавливаю смысл, если я в классе В изменю значение i то что получится? что эта переменная измениться в классе А, и изменится во всех подклассах? И что будет если я изменю переменную i в классе В? И почему я не могу изменить Z классе, через объект В изменить перемееную? простите Или же имелось ввиду что только класс В может менять protected перемееную, и никто больше......? Это сообщение отредактировал(а) Christoph - 30.12.2009, 17:42 -------------------- ![]() |
|||
|
||||
| 4EJIOBEK |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 26.3.2007 Репутация: нет Всего: 4 |
Нет имелось ввиду, что использовать protected поля напрямую нежелательно(если объявление класса и использование его protected поля находятся в пределах одного пакета). И совсем запрещено(разных пакетах) для того, чтоб не было возможности у классов имеющих одного предка(но находящихся в разных пакетах) менять состяние друг друга.
нет, если, конечно, это поле не объявлено статическим |
|||
|
||||
| LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
1. Есть static и не static переменные. static переменная принадлежит классу и одна на все экземпляры класса, и даже если нет ни одного экземпляра класса, static переменная все равно есть. Не static переменная принадлежит конкретному объекту и не существует без этого объекта и у каждого объекта своя переменная. К static переменным обращаются через имя класса: ИмяКласса.имяПеременной, к не static обращаются через ссылку на конкретный объект ссылка.имяПеременной. В этом коде:
обращения к str и i компилятор неявно заменяет на A.str и this.i. Дело в том, что любой не static метод имеет ссылку this, а static - нет. И поэтому обратится к не static переменной из static метода, без явного указания ссылки, нельзя. Аналогичная ситуация и с методами и классами. 2. Есть модификаторы доступа которые определяют какой код может, а какой нет обращаться к данной переменной/методу/классу. Модификаторы бывают private, <defailt>, protected, public (в порядке убывания строгости). Модификаторы доступа не зависят от того это static переменная/метод/класс или нет. Чтобы можно было обратится к переменной надо чтобы были выполнены оба пункта. В твоем первом примере пункт 1 выполнен, т.к. при обращении ты указал ссылку на объект ( ob1 ), а вот пункт 2 нет. Почему нет, я подробно расписал в своем первом посте. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |