| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Пакеты и наследование |
| Автор: Christoph 29.12.2009, 13:48 | ||||
| Вопрос достаточно просто, только изучаю Java Создаю 2 пакета
в пакете р1 есть поле protected, и я получить к ней доступ из другого пакета при условии что, класс другого пакета будет подклассом, верно? мне пишет компилятор что переменнная i не видна в пакете p2. Или может что то я не так понял, спасибо! |
| Автор: jk1 29.12.2009, 14:06 | ||
Помните, что наследование в Java добавляет в класс-наследник все не-private члены класса-предка, кроме конструкторов. Правильное обращение в таком случае будет выглядеть как
Но даже в этом случае ваш код не скомпилируется: вы обращаетесь из статического метода (это метод класса) к переменной объекта (непонятно какого и есть ли он вообще). Чтобы объявить переменную класса, используйте модификатор static |
| Автор: LSD 29.12.2009, 15:43 | ||
Это сделано специально, вот немного модифицированный второй класс:
Как видишь первый два присваивания к this и p2BLoj проходят, а к p1BLoj - нет. И так сделано чтобы избежать следующей ситуации: есть базовый класс A с protected переменной i, от него наследуется класс B, который использует переменную i, при этом произвольно менять значение переменной i нельзя, чтобы не испортить данные. А теперь мы создаем класс Z, который наследуется от A, определим в нем подобный метод и передадим туда экземпляр класса B. Если бы доступ был, то можно было бы произвольно изменить переменную i и нарушить целостность B. Теперь по поводу пакаджей, дело в том что protected переменная так же доступна и внутри пакаджа (это сделано, чтобы упорядочить модификаторы по строгости, и умолчальный модификатор был более строгим чем protected). И если оба класса находятся в одном пакадже, то доступ идет как package private переменной. |
| Автор: Samotnik 29.12.2009, 16:11 |
| Christoph, ты можешь к ней (переменной i) обратиться через this и не из статического метода |
| Автор: Christoph 29.12.2009, 18:00 | ||
Теперь вот так будет правильно? получается что из статического метода можно вызывать только статические переменные, и методы, вы уж простите, но я вот хотел узнать что, для чего нужны статические методы, чтоб можно было вызывать без объекта? - это получается что это обычная функция? или же статическая переменная- как по мне это просто глобальная переменная которая доступна во всех подклассах.Может быть статические методы используются для чего то другого, спасибо |
| Автор: jk1 29.12.2009, 18:13 | ||||
Вот цитата "из первых рук" и пример:
подробнее читайте http://java.sun.com/docs/books/tutorial/java/javaOO/classvars.html или http://javagu.ru/portal/dt?last=false&provider=javaguru&ArticleId=GURU_ARTICLE_64548&SecID=GURU_SECTION_63111 |
| Автор: MaxPayneC 29.12.2009, 18:23 |
| Статические методы вызываются у класса, нестатические (также называемые instance-методы) - у экземпляра класса. Это нужно для того, что не всегда действия выполняются с сущностью, а иногда с классом этой сущности. Из статических методов доступны только статические переменные класса, но обратное неверно - из инстанс-методов доступны и инстанс-переменные, и статические переменные. |
| Автор: Christoph 29.12.2009, 18:42 |
| Спасибо за информацию буду читать |
| Автор: LSD 29.12.2009, 20:15 |
| Раз уж вы во всем разобрались, то объясните мне при чем тут статические переменные (я говорю про первый пример)? |
| Автор: Christoph 29.12.2009, 21:58 |
| ну чтоб что то делать в статическом методе надо использовать только статические переменные или статические методы |
| Автор: jk1 29.12.2009, 22:57 | ||||
Это не так, читайте внимательнее приведенные статьи. Из методов класса (статика) можно вызывать методы объекта (не статика), но для этого объект должен существовать. Вот пример:
|
| Автор: Christoph 29.12.2009, 23:34 | ||
Ну вот существует реальный объект, но вызвать не могу |
| Автор: jk1 30.12.2009, 08:52 | ||
Унаследованный protected-метод будет доступен как метод объекта вызывающего класса:
|
| Автор: LSD 30.12.2009, 12:36 |
| Может уже пора внимательно посмотреть на первый пример, попробовать его скомпилировать и внимательно прочитать сообщение об ошибке? |
| Автор: 4EJIOBEK 31.12.2009, 11:12 | ||
Нет имелось ввиду, что использовать protected поля напрямую нежелательно(если объявление класса и использование его protected поля находятся в пределах одного пакета). И совсем запрещено(разных пакетах) для того, чтоб не было возможности у классов имеющих одного предка(но находящихся в разных пакетах) менять состяние друг друга.
нет, если, конечно, это поле не объявлено статическим |
| Автор: LSD 31.12.2009, 12:21 | ||||
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 нет. Почему нет, я подробно расписал в своем первом посте. |