![]() |
|
Модераторы: 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 -------------------- ![]() |
|||
|
||||
![]()
|
| Правила форума "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. |