<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8592713917061554150</id><updated>2011-11-27T16:16:02.472-08:00</updated><category term='модификаторы'/><category term='условный оператор'/><category term='abstract'/><category term='xor'/><category term='массивы'/><category term='деление'/><category term='сбощик мусора'/><category term='литералы'/><category term='модификаторы доступа'/><category term='глава 2'/><category term='резюме'/><category term='static'/><category term='сложение'/><category term='типы данных'/><category term='instanceof'/><category term='конкатенация'/><category term='вычитание'/><category term='or'/><category term='тест'/><category term='глава 1'/><category term='основы язык'/><category term='деление по модулю'/><category term='основы языка'/><category term='download'/><category term='NaN'/><category term='ответы на тест'/><category term='операторы'/><category term='toString'/><category term='garbage collection'/><category term='сравнение'/><category term='глава 3'/><category term='умножение'/><category term='final'/><category term='присваивание'/><category term='hashCode'/><category term='and'/><category term='сдвиг'/><category term='передача параметров'/><category term='equals'/><category term='арифметические операторы'/><title type='text'>Java</title><subtitle type='html'>&lt;small&gt;&lt;p align="left"&gt;&amp;copy 2008 Наталия Македа&lt;br&gt;
Все материалы блога защищены авторским правом. Любая перепечатка или использование материалов этого блога в коммерческих целях возможна лишь с письменного согласия автора. При некоммерческом использовании ссылка на блог обязательна.&lt;/p&gt;&lt;/small&gt;</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-143571061126234474</id><published>2010-01-03T08:19:00.000-08:00</published><updated>2010-01-03T08:44:55.341-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='static'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>static (Выпуск 19)</title><content type='html'>&lt;p&gt;Модификатор &lt;span style="font-family:courier new;"&gt;static&lt;/span&gt; (статичный) применяется переменным, методам и даже к странным фрагментам кода, которые не являются частью метода. Статичные фрагменты кода принадлежат не объекту класса, но ко всему классу.&lt;/p&gt;&lt;p&gt;Рассмотрим пример простого класса с одной статичной переменной:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. class Ecstatic{&lt;br /&gt;2.     static int x = 0;&lt;br /&gt;3.     Ecstatic() { x++; }&lt;br /&gt;4. }&lt;/pre&gt;&lt;/code&gt;&lt;span class="fullpost"&gt;&lt;p&gt;Переменная &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; объявлена статичной. Это означает, что не важно, сколько объектов класса &lt;span style="font-family:courier new;"&gt;Ecstatic&lt;/span&gt; существует в данный момент - &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; всего лишь одна. При загрузке класса &lt;span style="font-family:courier new;"&gt;Ecstatic&lt;/span&gt; выделяется 4 байта под переменную &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt;. И её инициализация происходит (см. строку №2) тоже в момент загрузки класса. И каждый раз, когда создаётся объект класса &lt;span style="font-family:courier new;"&gt;Ecstatic&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; инкрементируется. Этот приём позволяет знать точное количество созданных объектов класса &lt;span style="font-family:courier new;"&gt;Ecstatic&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Получить доступ к статичным переменным можно двумя способами:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Через любой объект класса: &lt;span style="font-family:courier new;"&gt;обьект.переменная&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Через сам класс: &lt;span style="font-family:courier new;"&gt;класс.переменная&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Первый метод, однако, считается дурным тоном, так как очень сильно вводит в заблуждение. Давайте рассмотрим это на примере:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. Ecstatic e1 = new Ecstatic();&lt;br /&gt;2. Ecstatic e2 = new Ecstatic();&lt;br /&gt;3. e1.x = 100;&lt;br /&gt;4. e2.x = 200;&lt;br /&gt;5. reallyImportantVariable = e1.x;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Если вы заранее не знаете, что &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; - статичная переменная, то можете подумать, что в 5-й строке переменной &lt;span style="font-family:courier new;"&gt;reallyImportantVariable&lt;/span&gt; присваивается 100. Но на самом деле ей присваивается 200, потому что &lt;span style="font-family:courier new;"&gt;e1.x&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;e2.x&lt;/span&gt; - это всё одна и та же переменная &lt;span style="font-family:courier new;"&gt;х&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Поэтому лучше доступаться к статичным переменным через имя класса. Вот фрагмент кода, эквивалентный предыдущему:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. Ecstatic e1 = new Ecstatic();&lt;br /&gt;2. Ecstatic e2 = new Ecstatic();&lt;br /&gt;3. Ecstatic.x = 100; // Бессмысленное действие&lt;br /&gt;4. Ecstatic.x = 200;&lt;br /&gt;5. reallyImportantVariable = Ecstatic.x;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Теперь всё встаёт на свои места: строка 3 не несёт никакого смысла - это всего лишь лишняя операция, а в 5-й строке переменной &lt;span style="font-family:courier new;"&gt;reallyImportantVariable&lt;/span&gt; присваивается сразу 200.&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;&lt;p&gt;Статичные методы не могут использовать нестатичные элементы (переменные и методы) своиего класса, но могут использовать другие статичные элементы. Статичные методы не принадлежат ни одному объекту класса. Поэтому они могут вообще вызваться до того, как класс инстанциирован.&lt;/p&gt;&lt;p&gt;Каждое Java приложение содержит в себе статичный метод &lt;span style="font-family:courier new;"&gt;main()&lt;/span&gt;:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. class SomeClass {&lt;br /&gt;2.     static int i = 48;&lt;br /&gt;3.     int j = 1;&lt;br /&gt;4.&lt;br /&gt;5.     public static void main(String args[]) {&lt;br /&gt;6.        i += 100;&lt;br /&gt;7.        // j *= 5; Если раскомментировать, будет ошибка&lt;br /&gt;8.     }&lt;br /&gt;9. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Когда приложение запускается (то есть кто-то вызывает из коммандной строки &lt;span style="font-family:courier new;"&gt;java SomeClass&lt;/span&gt;), не существует ни одного объекта класса &lt;span style="font-family:courier new;"&gt;SomeClass&lt;/span&gt;. Однако существует переменная &lt;span style="font-family:courier new;"&gt;i&lt;/span&gt;, которая инициализурется во 2-й строке и инкрементируется в 6-й строке. А если бы мы раскомметировали 7-ю строку, то вообще получили бы ошибку компиляции, потому что статичный метод не может использовать нестатичные переменные класса.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-143571061126234474?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/143571061126234474/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=143571061126234474' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/143571061126234474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/143571061126234474'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2010/01/static-19.html' title='static (Выпуск 19)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-1879380168005072263</id><published>2009-10-13T06:47:00.000-07:00</published><updated>2009-10-13T06:47:00.601-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='abstract'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>abstract (Выпуск 18)</title><content type='html'>&lt;p&gt;Модификатор &lt;span style="font-family:courier new;"&gt;abstract&lt;/span&gt; применяется только для классов и методов.&lt;/p&gt;&lt;p&gt;Абстрактный &lt;strong&gt;класс &lt;/strong&gt;не может быть инстанциирован, то есть нельзя вызвать конструктор для создания его объекта.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;Абстрактные классы перекладывают имплементацию методов на "плечи" своих подклассов. Рассмотрим, к примеру, рисунок ниже:&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://i245.photobucket.com/albums/gg69/microstocker/java18/abstract.jpg" /&gt;&lt;/p&gt;&lt;p&gt;Разработчик класса &lt;span style="font-family:courier new;"&gt;Animal&lt;/span&gt; решил, что все животные должны иметь метод &lt;span style="font-family:courier new;"&gt;travel()&lt;/span&gt;. Поскольку каждое животное перемещается по-своему, то невозможно заимплементировать этот метод уникальным образом и просто наследовать этот метод в подклассы. Поэтому метод &lt;span style="font-family:courier new;"&gt;travel()&lt;/span&gt; объявлен с модификатором &lt;span style="font-family:courier new;"&gt;abstract&lt;/span&gt; следующим образом:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;abstract void travel();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Обратите внимание на точку с запятой (а не фигурных скобок) в конце объявления метода. Фигурные скобки вместе с телом метода отдаются на усмотрение подклассов. Суперкласс обеспечивает только сигнатуру метода, которой должны придерживаться подклассы. При этом подклассы класса &lt;span style="font-family:courier new;"&gt;Animal&lt;/span&gt; должны или заимплементировать метод &lt;span style="font-family:courier new;"&gt;travel()&lt;/span&gt; или опять объявить его абстрактным. Во втором случае имплементация абстрактного метода опять переносится в подклассы подкласса.&lt;/p&gt;&lt;p&gt;Если класс содержит обстрактный метод, то компилятор предлагает объявить и весь &lt;strong&gt;класс&lt;/strong&gt; абстрактным. Эта конвенция делает класс лёгким для использования другими разработчиками: им нужно всего лишь взглянуть на объявление класса, чтобы понять, можно ли инстанциировать класс непосредственно или для этого нужно создавать подкласс.&lt;/p&gt;&lt;p&gt;Класс рекомендуется объявлять абстрактным, если:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;В классе есть абстрактные методы.&lt;/li&gt;&lt;li&gt;Класс наследует абстрактные методы (от абстрактного суперкласса) и не предоставляет имплементации для всех унаследованных абстрактных методов.&lt;/li&gt;&lt;li&gt;Класс имплементирует интрефейс но не предоставляет имплементации для всех методов интерфейса.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Все эти три условия выше означают одно: класс абстрактен, если он не полностью имплементирован. Какая-то часть функциональности класса отсутствует и должна быть предоставлена одним из его подклассов.&lt;/p&gt;&lt;p&gt;Таким образом, можификатор &lt;span style="font-family:courier new;"&gt;abstract&lt;/span&gt; можно считать противоположностью модификатору &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt;. Финальный класс &lt;em&gt;не может&lt;/em&gt; иметь подклассов. Абстрактный класс &lt;em&gt;должен&lt;/em&gt; иметь подклассы.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-1879380168005072263?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/1879380168005072263/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=1879380168005072263' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/1879380168005072263'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/1879380168005072263'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/10/abstract-18.html' title='abstract (Выпуск 18)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i245.photobucket.com/albums/gg69/microstocker/java18/th_abstract.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-5732891092929253311</id><published>2009-10-12T06:13:00.000-07:00</published><updated>2009-10-12T06:35:09.507-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='final'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>final (Выпуск 18)</title><content type='html'>&lt;p&gt;Модификатор &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt; может применяться к классам, методам и переменным. При этом его конкретное значение зависит от контекста. Но в общем модификатор &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt; означает, что элемент не может быть модифицирован, изменён.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;В частности, &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt; &lt;strong&gt;класс&lt;/strong&gt; не может иметь подклассов. Например, следующий код просто не откомпилируется, потому что &lt;span style="font-family:courier new;"&gt;java.lang.Math&lt;/span&gt; имеет модификатор &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt;:&lt;/p&gt;&lt;p&gt;&lt;code&gt;class SubMath extends java.lang.Math { }&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Получаем ошибку компиляции: "Can’t subclass final classes." ("Невозможно создать подкласс от класса final")&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;Final&lt;/span&gt; &lt;strong&gt;переменная&lt;/strong&gt; не может принимать значение, которое отличается от того, что было присвоено при инициализации. Поэтому в Java переменные с модификатором &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt; играют роль &lt;span style="font-family:courier new;"&gt;const&lt;/span&gt; в C++ и &lt;span style="font-family:courier new;"&gt;#define&lt;/span&gt; в С. Например в классе &lt;span style="font-family:courier new;"&gt;java.lang.Math&lt;/span&gt; есть переменная с модификатором &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt; типа &lt;span style="font-family:courier new;"&gt;double&lt;/span&gt;, которая называется &lt;span style="font-family:courier new;"&gt;PI&lt;/span&gt;. Очевидно, что число пи не должно изменяться по прихоти программиста.&lt;/p&gt;&lt;p&gt;Если &lt;strong&gt;объекту&lt;/strong&gt; назначен модификатор final, то это означает, что ссылка (указатель) на объект должна оставаться неизменной, хотя сам объект может меняться. Проиллюстрируем это примером:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. class Walrus {&lt;br /&gt;2.     int weight;&lt;br /&gt;3.     Walrus(int w) { weight = w; }&lt;br /&gt;4. }&lt;br /&gt;5.&lt;br /&gt;6. class Tester {&lt;br /&gt;7.      final Walrus w1 = new Walrus(1500);&lt;br /&gt;8.      void test() {&lt;br /&gt;9.          w1 = new Walrus(1400); // Illegal&lt;br /&gt;10.         w1.weight = 1800; // Legal&lt;br /&gt;11.     }&lt;br /&gt;12. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Обратите внимание, как в строке 7 объект &lt;span style="font-family:courier new;"&gt;w1&lt;/span&gt; был объявлен с модификатором &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt;. Именно поэтому в строке 9 выполняется недопустимая операция создания нового указателя на объект. Хотя в строке 10 мы можем изменить значение некоторых полей объекта.&lt;/p&gt;&lt;p&gt;Иными словами:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;Нельзя&lt;/em&gt; менять ссылку на объект, то есть пересоздавать объект.&lt;/li&gt;&lt;li&gt;&lt;em&gt;Можно&lt;/em&gt; изменять значения полей.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Наконец, &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt; &lt;strong&gt;метод&lt;/strong&gt; не может быть переопределён (&lt;em&gt;overriden&lt;/em&gt;). Например, следующий код не откомпилируется:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. class Mammal {&lt;br /&gt;2.     final void getAround() { }&lt;br /&gt;3. }&lt;br /&gt;4.&lt;br /&gt;5. class Dolphin extends Mammal {&lt;br /&gt;6.     void getAround() { }&lt;br /&gt;7. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Дельфины плавают совершенно по-другому в отличие от большинства млекопитающих. Поэтому имеет смысл переопределить метод унаследованный метод &lt;span style="font-family:courier new;"&gt;getAround()&lt;/span&gt;. Но этот метод &lt;span style="font-family:courier new;"&gt;final&lt;/span&gt;, поэтому в 6 строке мы получим ошибку компиляции "Final methods can’t be overridden." (Финальные методы не могут быть переопределены)&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-5732891092929253311?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/5732891092929253311/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=5732891092929253311' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/5732891092929253311'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/5732891092929253311'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/10/final-18.html' title='final (Выпуск 18)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-8331744932623151506</id><published>2009-04-15T03:34:00.000-07:00</published><updated>2009-04-15T03:46:09.271-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы доступа'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>Модификаторы доступа: резюме. Другие модификаторы (Выпуск 17)</title><content type='html'>&lt;p&gt;Java предоставляет следующие модификаторы доступа (от самого разрешающего до самого ограничивающего):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;public&lt;/span&gt; - элемент доступен из любого класса&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt; - элемент доступен из подкласса или из любого класса пакета того класса, в котором находится элемент&lt;/li&gt;&lt;li&gt;&lt;em&gt;default&lt;/em&gt; - элемент доступен из из любого класса пакета того класса, в котором находится элемент&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;private&lt;/span&gt; - элемент доступен лишь из того класса, в котором находится&lt;/li&gt;&lt;/ul&gt;&lt;span class="fullpost"&gt;&lt;p&gt;Элементы подклассов могут иметь любой модификатор доступа, отличный от наследуемого, если только новый модификатор доступа не является более ограничивающим. В противном случае возникает ошибка компиляции.&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;В следующих статьях мы рассмотрим другие модификаторы: final, abstract, static, native, transient, synchronized, and volatile. &lt;/p&gt;&lt;p&gt;В Java порядок объявления модификаторов не имеет значения. Например, если вы напишите, что класс public final, то это равносильно тому, если бы вы написали final public. Если вы обхъявите метод protected static - это тоже самое, что и объявить его static protected. &lt;/p&gt;&lt;p&gt;Не все модификаторы одинаково применимы к разным элементам Java-языка (т.е. класс, переменная, метод, конструктор). Более детальные разъяснения будут даны в следующих статьях.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-8331744932623151506?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/8331744932623151506/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=8331744932623151506' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/8331744932623151506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/8331744932623151506'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/04/17_15.html' title='Модификаторы доступа: резюме. Другие модификаторы (Выпуск 17)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-2140052610637452317</id><published>2009-04-15T02:41:00.000-07:00</published><updated>2009-04-15T03:52:19.761-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы доступа'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>Подклассы и методы (Выпуск 17)</title><content type='html'>&lt;p&gt;Согласно спецификации Java методы не могут быть переписаны (например, в наследуемых классах). Например, у апплетов есть метод &lt;span style="font-family:courier new;"&gt;init()&lt;/span&gt;. Этот метод должен переписывать одноименный метод из супер-класса&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;java.applet.Applet&lt;/span&gt;, доступ к которому &lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;. Таким образом, переписывающий метод &lt;span style="font-family:courier new;"&gt;init()&lt;/span&gt; из подкласса класса &lt;span style="font-family:courier new;"&gt;java.applet.Applet&lt;/span&gt; не можеть иметь более ограничивающий доступ, т.е., &lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt; или &lt;em&gt;default &lt;/em&gt;- его модификатор доступа может быть только public. В противном случае на этапе компиляции возникнет ошибка "&lt;em&gt;Methods can’t be overridden to be more private&lt;/em&gt;" (Доступ к методам не может быть более ограниченным).&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;На рисунке ниже мы представили иерархию модификаторов доступа. Слева находится самый ограничивающий модификатор доступа. Справа - самый разрешающий. Методы подклассов могут иметь модификатор доступа отличный, от наследуемого, если он является более разрешающим (т.е. находится правее исходного модификатора доступа на рис. ниже).&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://i668.photobucket.com/albums/vv50/microstocker2/java17/hierarchy1.gif" /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Иерархия модификаторов доступа&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Таким образом модификатор доступа к методу и подкласса может быть следующим:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;private&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;, &lt;em&gt;default&lt;/em&gt;, если модификатор доступа у метода суперкласса &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;, &lt;em&gt;default&lt;/em&gt;, если модификатор доступа у метода суперкласса &lt;span style="font-size:0;"&gt;&lt;em&gt;default&lt;/em&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;, если модификатор доступа у метода суперкласса &lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;, если модификатор доступа у метода суперкласса &lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;На следующем рисунке показана "обратная" иерархия, которая приведёт к ошибке компиляции:&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://i668.photobucket.com/albums/vv50/microstocker2/java17/hierarchy2.gif" /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Обратная иерархия&lt;/span&gt;&lt;/p&gt;&lt;p&gt;То есть:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;em&gt;default&lt;/em&gt; не может быть ограничен до &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt; не может быть ограничен до &lt;em&gt;default&lt;/em&gt; или &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;public&lt;/span&gt; не может быть ограничен до &lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;, &lt;em&gt;default&lt;/em&gt; или &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-2140052610637452317?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/2140052610637452317/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=2140052610637452317' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/2140052610637452317'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/2140052610637452317'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/04/17.html' title='Подклассы и методы (Выпуск 17)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i668.photobucket.com/albums/vv50/microstocker2/java17/th_hierarchy1.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-1301718905143044146</id><published>2009-01-26T07:57:00.000-08:00</published><updated>2009-01-26T08:11:20.197-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы доступа'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>protected (Выпуск 16)</title><content type='html'>&lt;p&gt;Название &lt;em&gt;protected&lt;/em&gt; (защищённый) слегка сбивает с толку. Читатель может подумать, что защищённый доступ имеет очень ограничивающую натуру, что-то вроде &lt;a href="http://javapd.blogspot.com/2009/01/private.html"&gt;приватного&lt;/a&gt;. В реальности же защищённые элементы являются более доступны, чем, скажем, элементы с доступом &lt;a href="http://javapd.blogspot.com/2009/01/default-16.html"&gt;по умолчанию&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Только переменные и методы могут иметь защищённый модификатор доступа. Защищённый элемент доступен всем остальным классам из того же пакета, как и в случае с доступом по умолчанию. Кроме того, защищённый элемент класса доступен всем его подклассам, даже если они находятся в других пакетах.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;В качестве примера рассмотрим фрагмент кода:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. package sportinggoods;&lt;br /&gt;2. class Ski {&lt;br /&gt;3.     void applyWax() { . . . }&lt;br /&gt;4. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;У метода &lt;span style="font-family:courier new;"&gt;applyWax()&lt;/span&gt; доступ по умолчанию. Теперь рассмотрим подкласс:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. package sportinggoods;&lt;br /&gt;2. class DownhillSki extends Ski {&lt;br /&gt;3.     void tuneup() {&lt;br /&gt;4.         applyWax();&lt;br /&gt;5.         // продолжение кода&lt;br /&gt;6.     }&lt;br /&gt;7. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Подкласс вызывает унаследованный метод &lt;span style="font-family:courier new;"&gt;applyWax()&lt;/span&gt;. Всё идёт, как надо, поскольку оба класса &lt;span style="font-family:courier new;"&gt;Ski&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;DownhillSki&lt;/span&gt; находятся в одном и том же пакете. Но если один из этих классов по какой-то причине будет перемещён в другой пакет, &lt;span style="font-family:courier new;"&gt;DownhillSki&lt;/span&gt; больше не будт иметь доступа к наследуемому методу &lt;span style="font-family:courier new;"&gt;applyWax()&lt;/span&gt; и код не откомпилируется. Данная проблема решается при добавлении защмщённого модификатора доступа к методу &lt;span style="font-family:courier new;"&gt;applyWax()&lt;/span&gt; в строке 3:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. package adifferentpackage; // Класс Ski в&lt;br /&gt;                              // другом пакете&lt;br /&gt;2. class Ski {&lt;br /&gt;3.     protected void applyWax() { . . . }&lt;br /&gt;4. }&lt;/pre&gt;&lt;/code&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-1301718905143044146?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/1301718905143044146/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=1301718905143044146' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/1301718905143044146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/1301718905143044146'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/01/protected-16.html' title='protected (Выпуск 16)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-6410860867662598820</id><published>2009-01-26T07:32:00.000-08:00</published><updated>2009-01-26T07:56:54.055-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы доступа'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>Default (Выпуск 16)</title><content type='html'>&lt;p&gt;&lt;em&gt;Default&lt;/em&gt; (по умолчанию)- это способ доступа к классам, переменным и методам, если иной другой модификатор доступа не указан. Данные класса или его методы могут быть доступны по умолчанию, равно как и сам класс может быть доступен по умолчанию. &lt;/p&gt;&lt;p&gt;&lt;em&gt;Default &lt;/em&gt;не является ключевым словом в Java, но это всего лишь понятие, обозначающее уровень доступа в том случае, если не задан никакой явный модификатор доступа.&lt;/p&gt;&lt;p&gt;Когда вы пишете приложение, для которого нужно разработать несколько классов, то скорее всего вы размещаете ваши файлы с расширением .java, а байткоды соответствующий классов (.class) - в другой директории. И вот эта другая директория с точки зрения JRE (Java Runtime Environment) является &lt;em&gt;пакетом&lt;/em&gt;.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;Если вы не озаботитесь обозначением модификаторов доступа для всяких разных ваших классов, а также их данных и методов, то им будет присвоен модификатор доступа по умолчанию. А это означает их доступность любым другим классам в том же самом пакете. &lt;/p&gt;&lt;p&gt;&lt;strong&gt;Все классы в одном пакете с модификатором доступа по умолчанию могут доступаться к данным и методам друг друга. &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Классы из других пакетов не могут получить доступ к вашим классам, поскольку у ваших классов можификатор доступа &lt;em&gt;default&lt;/em&gt;, а не &lt;em&gt;public&lt;/em&gt;! Даже если у классов вне вашего пакета есть подклассы из вашего пакета (например, такая ситуация характерна для апплетов), то и подклассы не могут доступаться по умолчанию, потому что модификатор &lt;em&gt;default&lt;/em&gt;, а не &lt;em&gt;protected&lt;/em&gt; или &lt;em&gt;public&lt;/em&gt;. Рисунок ниже иллюстрирует разные ситуации с доступом по умолчанию внутри пакета и вне его:&lt;/p&gt;&lt;p align="center"&gt;&lt;img src="http://i245.photobucket.com/albums/gg69/microstocker/java16/default_java.gif" /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;Только классы из одного пакета могут получать доступ к элементам других классов, не имеющим ямного модификатора доступа&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-6410860867662598820?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/6410860867662598820/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=6410860867662598820' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/6410860867662598820'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/6410860867662598820'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/01/default-16.html' title='Default (Выпуск 16)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i245.photobucket.com/albums/gg69/microstocker/java16/th_default_java.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-319092794896104521</id><published>2009-01-09T01:23:00.000-08:00</published><updated>2009-01-09T01:32:24.476-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы доступа'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>private</title><content type='html'>&lt;p&gt;Самый ограничивающий модификатор – &lt;strong&gt;private&lt;/strong&gt; (приватный). &lt;em&gt;Приватный&lt;/em&gt; метод или переменная могут быть использованы только внутри объекта класса, в котором они объявлены. Например, у нас имеется следующий фрагмент кода:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. class Complex {&lt;br /&gt;2.     private double real, imaginary;&lt;br /&gt;3.&lt;br /&gt;4.     public Complex(double r, double i) {&lt;br /&gt;5.         real = r; imaginary = i;&lt;br /&gt;6.     }&lt;br /&gt;7.     public Complex add(Complex c) {&lt;br /&gt;8.         return new Complex(real + c.real,&lt;br /&gt;9.             imaginary + c.imaginary);&lt;br /&gt;10.     }&lt;br /&gt;11. }&lt;br /&gt;12.&lt;br /&gt;13. class Client {&lt;br /&gt;14.     void useThem() {&lt;br /&gt;15.         Complex c1 = new Complex(1, 2);&lt;br /&gt;16.         Complex c2 = new Complex(3, 4);&lt;br /&gt;17.         Complex c3 = c1.add(c2);&lt;br /&gt;18.         double d = c3.real; // Illegal!&lt;br /&gt;19.     }&lt;br /&gt;20. }&lt;/pre&gt;&lt;/code&gt;&lt;span class="fullpost"&gt;&lt;p&gt;В строке 17 мы вызываем &lt;span style="font-family:courier new;"&gt;c1.add(c2)&lt;/span&gt;. Объект &lt;span style="font-family:courier new;"&gt;c1&lt;/span&gt; вызывает метод &lt;span style="font-family:courier new;"&gt;add&lt;/span&gt; и использует при этом объект &lt;span style="font-family:courier new;"&gt;c2&lt;/span&gt; в качестве параметра. Смотрите дальше, в строке 8 &lt;span style="font-family:courier new;"&gt;c1&lt;/span&gt; имеет доступ к своим приватным переменным и к приватным переменным объекта &lt;span style="font-family:courier new;"&gt;c2!&lt;/span&gt; И это не ошибка. &lt;/p&gt;&lt;p&gt;Объявление переменных &lt;span style="font-family:courier new;"&gt;real&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;imaginary&lt;/span&gt; с модификатором &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt; означает, что эти переменные могут быть доступны только в экземплярах (&lt;em&gt;instance&lt;/em&gt;) класса &lt;span style="font-family:courier new;"&gt;Complex&lt;/span&gt; для любых экземпляров класса &lt;span style="font-family:courier new;"&gt;Complex&lt;/span&gt;. Таким образом &lt;span style="font-family:courier new;"&gt;c1&lt;/span&gt; имеет доступ не только к своим собственным полям &lt;span style="font-family:courier new;"&gt;real&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;imaginary&lt;/span&gt; но и к полям &lt;span style="font-family:courier new;"&gt;real&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;imaginary&lt;/span&gt; любого экземпляра класса &lt;span style="font-family:courier new;"&gt;Complex&lt;/span&gt;. Модификаторы доступа определяют какие &lt;em&gt;классы&lt;/em&gt; могут доступаться к разным элементам (поля, методы и т.д.), но не какие &lt;em&gt;экземпляры классов&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Строка 18 нелегальна и приведёт к ошибке компиляции с сообщением: “&lt;em&gt;Variable real in class Complex not accessible from class Client&lt;/em&gt;”. (Переменная real в классе Complex недоступна из класса Client) .Приватная переменная &lt;span style="font-family:courier new;"&gt;real&lt;/span&gt; может быть доступна только для экземпляра класса &lt;span style="font-family:courier new;"&gt;Complex&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Приватные данные могут быть скрыты от любого объекта. Если у класса &lt;span style="font-family:courier new;"&gt;Complex&lt;/span&gt; есть подкласс &lt;span style="font-family:courier new;"&gt;SubComplex&lt;/span&gt;, то любой экземпляр класса &lt;span style="font-family:courier new;"&gt;SubComplex&lt;/span&gt; будет наследовать переменные &lt;span style="font-family:courier new;"&gt;real&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;imaginary&lt;/span&gt;. И тем не менее, &lt;strong&gt;ни один экземпляр класса &lt;span style="font-family:courier new;"&gt;SubComplex&lt;/span&gt; не сможет получить доступ к значениям тех переменных&lt;/strong&gt;. Поэтому, например, следующий код не откомпилируется:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. class Complex {&lt;br /&gt;2.     private double real, imaginary;&lt;br /&gt;3. }&lt;br /&gt;4.&lt;br /&gt;5.&lt;br /&gt;6. class SubComplex extends Complex {&lt;br /&gt;7.     SubComplex(double r, double i) {&lt;br /&gt;8.         real = r; // Trouble!&lt;br /&gt;9.     }&lt;br /&gt;10. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;В конструкторе класса &lt;span style="font-family:courier new;"&gt;SubComplex&lt;/span&gt; (строка 8), мы обращаемся к переменной &lt;span style="font-family:courier new;"&gt;real&lt;/span&gt;. И в этой строке возникает ошибка компиляции с сообщением: “&lt;em&gt;Undefined variable: real&lt;/em&gt;.” (Не определена переменная real.) Модификатор &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt; переменной &lt;span style="font-family:courier new;"&gt;real&lt;/span&gt; предотврашает к ней доступ из экземпляра класса &lt;span style="font-family:courier new;"&gt;SubComplex&lt;/span&gt;, то есть &lt;span style="font-family:courier new;"&gt;SubComplex&lt;/span&gt; не может доступиться к собственной переменной!&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-319092794896104521?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/319092794896104521/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=319092794896104521' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/319092794896104521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/319092794896104521'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/01/private.html' title='private'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-3603230710654490560</id><published>2009-01-09T01:19:00.000-08:00</published><updated>2009-01-09T01:21:05.728-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы доступа'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>public</title><content type='html'>&lt;p&gt;Модификатор, который обеспечивает максимальную свободу в использовании классов, их полей и методов, - это &lt;strong&gt;public&lt;/strong&gt; (публичный). &lt;em&gt;Публичный&lt;/em&gt; класс, переменная или метод могут использоваться в любых Java программах без каких-либо ограничений. Например, если апплет (подкласс класса java.applet.Applet) объявлен публичным, то он может быть инстанциирован в браузерах. Приложение декларирует свой метод &lt;span style="font-family:courier new;"&gt;main()&lt;/span&gt; публичным, чтобы этот метод мог быть легко вызван из любого JRE (Java runtime Environment).&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-3603230710654490560?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/3603230710654490560/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=3603230710654490560' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/3603230710654490560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/3603230710654490560'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2009/01/public.html' title='public'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-7884372505869573870</id><published>2008-11-24T03:44:00.000-08:00</published><updated>2008-11-24T04:00:41.797-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы доступа'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>3.2 Модификаторы доступа (Выпуск 14)</title><content type='html'>&lt;p&gt;Модификаторы доступа определяют, могут ли классы использовать разнообразные элементы (сами классы, переменные-поля классов, методы классов и коснтрукторы) и как они могут их использовать.&lt;/p&gt;&lt;p&gt;Существует три модификатора доступа:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;private&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Элементы (см. выше) могут иметь один и более модификаторов, либо не иметь их вовсе. Однако, среди всевозможных модификаторов элемента &lt;strong&gt;количество модификаторов доступа долно быть не больше одного&lt;/strong&gt;. &lt;/p&gt;&lt;p&gt;Если элемент не имеет модификатора, то доступ к нему определяется &lt;em&gt;по умолчанию&lt;/em&gt;, то есть &lt;em&gt;default&lt;/em&gt;. Однако, &lt;strong&gt;ключевого слова &lt;em&gt;default&lt;/em&gt; не существует&lt;/strong&gt;! Другие наименования доступа по умолчанию, которые вы можете встретить в литературе, включают в себя &lt;em&gt;friendly&lt;/em&gt;, &lt;em&gt;package&lt;/em&gt;.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;p&gt;Ниже мы приводим примеры легально объявленых элементов с модификаторами или без них. Легальность некоторых объявлений зависит от контекста.&lt;/p&gt;&lt;code&gt;&lt;pre&gt;class Parser { ... }&lt;br /&gt;public class EightDimensionalComplex { ... }&lt;br /&gt;private int i;&lt;br /&gt;Graphics offScreenGC;&lt;br /&gt;protected double getChiSquared() { ... }&lt;br /&gt;private class Horse { ... }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;А вот примеры нелегальных объявлений элементов:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;public protected int x; // Не более одного модификатора доступа!&lt;br /&gt;default Button getBtn() {...} // "default" - это не ключевое слово&lt;/pre&gt;&lt;/code&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-7884372505869573870?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/7884372505869573870/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=7884372505869573870' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/7884372505869573870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/7884372505869573870'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/11/32.html' title='3.2 Модификаторы доступа (Выпуск 14)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-97449949443666155</id><published>2008-11-24T03:04:00.000-08:00</published><updated>2008-11-24T04:00:31.082-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 3'/><category scheme='http://www.blogger.com/atom/ns#' term='модификаторы'/><title type='text'>Глава 3: Модификаторы (Выпуск 14)</title><content type='html'>&lt;p&gt;&lt;em&gt;Модификаторы&lt;/em&gt; - это ключевые слова в Java, которые сообщают компилятору информацию о природе кода, данных или классов. Например, модификаторы определяют, является ли некий элемент (класс, метод, переменная) приватным или публичным, статичным или финальным.&lt;/p&gt;&lt;h3&gt;3.1 Обзор модификаторов&lt;/h3&gt;&lt;p&gt;Наиболее распространённые модификаторы - модификаторы доступа: &lt;span style="font-family:courier new;"&gt;public&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;protected&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;private&lt;/span&gt;. О них мы поговорим сразу в следующей статье. Все остальные модификаторы не подпадают ни под какую чёткую классификацию. Мы их просто перечислим:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;final&lt;/li&gt;&lt;li&gt;abstract&lt;/li&gt;&lt;li&gt;static&lt;/li&gt;&lt;li&gt;native&lt;/li&gt;&lt;li&gt;transient&lt;/li&gt;&lt;li&gt;synchronized&lt;/li&gt;&lt;li&gt;volatile&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Каждому из этих модификаторов будет посвящена отдельная статья в будущем.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-97449949443666155?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/97449949443666155/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=97449949443666155' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/97449949443666155'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/97449949443666155'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/11/3.html' title='Глава 3: Модификаторы (Выпуск 14)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-4010138712894405481</id><published>2008-11-05T05:10:00.000-08:00</published><updated>2010-11-28T03:21:11.682-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='тест'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>Ответы на тест по операторам (Выпуск 13)</title><content type='html'>&lt;span style="font-size: 85%;"&gt;Вопросы теста можно посмотреть &lt;/span&gt;&lt;a href="http://javapd.blogspot.com/2008/10/2-12.html"&gt;&lt;span style="font-size: 85%;"&gt;здесь&lt;/span&gt;&lt;/a&gt;&lt;span style="font-size: 85%;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;Ответ: С&lt;/strong&gt;&lt;br /&gt;Вычисление производится в таком порядке: &lt;span style="font-family: courier new;"&gt;x = a + b; a = a + 1; b = b + 1; &lt;/span&gt;Поэтому &lt;span style="font-family: courier new;"&gt;x = 6 + 7&lt;/span&gt; то есть 13. После чего переменные &lt;span style="font-family: courier new;"&gt;a&lt;/span&gt; и &lt;span style="font-family: courier new;"&gt;b&lt;/span&gt; инкрементируются до значений 7 и 8 соответственно.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: B, С&lt;/strong&gt;&lt;br /&gt;В варианте &lt;strong&gt;A&lt;/strong&gt; использование оператора ! незаконно, поскольку x является переменной типа &lt;span style="font-family: courier new;"&gt;int&lt;/span&gt;, а не &lt;span style="font-family: courier new;"&gt;boolean&lt;/span&gt;. На этом часто попадаются C и C++ программисты. В варианте &lt;strong&gt;B &lt;/strong&gt;выражение &lt;span style="font-family: courier new;"&gt;(x&amp;lt;3)&lt;/span&gt; имеет тип &lt;span style="font-family: courier new;"&gt;boolean&lt;/span&gt;, поэтому перед ним можно использовать оператор !. В ответе &lt;strong&gt;C&lt;/strong&gt; поразрядный оператор ~ применен к целочисленному x, значение которого равно 6, что в битовом виде имеет форму 0..0110 (на месте двух точек должны стоять 27 нулей). После применения оператора ~ x примет значение 1..1001 (на месте двух точек подставьте 27 единиц).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: A&lt;/strong&gt;&lt;br /&gt;Битовое представление -1 состоит из единиц во всех разрядах. В варианте &lt;strong&gt;A&lt;/strong&gt; эта строка из единиц сдвигается вправо на 5 позиций и освободившиеся 5 первых позиций заполняются нулями. Это в десятичном выражении имеет положительное значение 134217727. В варианте &lt;strong&gt;B&lt;/strong&gt; аналогичный сдвиг происходит на 32 разряда и результат состоит из строки, у которой во всех позициях нули, то есть 0. Вариант &lt;strong&gt;C &lt;/strong&gt;недопустим, потому что результат выражения &lt;span style="font-family: courier new;"&gt;x &amp;lt;&amp;lt;&amp;lt; 5&lt;/span&gt; имеет тип &lt;span style="font-family: courier new;"&gt;int&lt;/span&gt; и не может быть присвоен переменной типа &lt;span style="font-family: courier new;"&gt;byte&lt;/span&gt; без явного приведения типов, которое в данном случае отсутствует. Наконец, в варианте &lt;strong&gt;D&lt;/strong&gt; при сдвиге все освободившиеся позиции принимают значение наиболее значимого разряда исходного значения, то есть -1. Результат операции не отличается от исходного значения и равен -1. &lt;/li&gt;&lt;span class="fullpost"&gt;&lt;li&gt;&lt;strong&gt;Ответ: A, C, E &lt;/strong&gt;&lt;br /&gt;Варианты &lt;strong&gt;A&lt;/strong&gt; и &lt;strong&gt;C&lt;/strong&gt; эквивалентны, поскольку &lt;span style="font-family: courier new;"&gt;x+=y&lt;/span&gt; эквивалентно &lt;span style="font-family: courier new;"&gt;x = x+y&lt;/span&gt;. Выражение &lt;span style="font-family: courier new;"&gt;x+y&lt;/span&gt; "суммирует" строки и целое число, в результате из целого числа будет создан объект строкового типа и потом будет создана новая строка (ещё один новый объект строкового типа) со значением "Hello9". В варианте &lt;strong&gt;B&lt;/strong&gt; сравнение &lt;span style="font-family: courier new;"&gt;x == y&lt;/span&gt; незаконно, потому что целочисленный тип не может сравниваться с указателем. В варианте &lt;strong&gt;D&lt;/strong&gt; в результате вычисления выражения &lt;span style="font-family: courier new;"&gt;y+x&lt;/span&gt; также, как и в вариантах &lt;strong&gt;A&lt;/strong&gt; и &lt;strong&gt;C&lt;/strong&gt; создаётся новая строка. Но в последствии она присваивается переменной целочисленного типа, а это недопустимо. Вариант &lt;strong&gt;E&lt;/strong&gt; самый оригинальный. В нём важны два момента: условный оператор :? и укороченный оператор &amp;amp;&amp;amp;. Левый операнд укороченого оператора, то есть выражение &lt;span style="font-family: courier new;"&gt;(x != null)&lt;/span&gt;, всегда равен &lt;span style="font-family: courier new;"&gt;false&lt;/span&gt;. Следовательно правый операнд, то есть выражение &lt;span style="font-family: courier new;"&gt;(x.length() &amp;gt; 0),&lt;/span&gt; никогда не будет вычисляться, поскольку всё выражение заведомо равняется значению &lt;span style="font-family: courier new;"&gt;false&lt;/span&gt;. Это значение &lt;span style="font-family: courier new;"&gt;false&lt;/span&gt; затем используется в выражении условного оператора, результат которого будет равен 0 (операнд после двоеточия). &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: A, E&lt;/strong&gt;&lt;br /&gt;Хотя &lt;span style="font-family: courier new;"&gt;int&lt;/span&gt; и &lt;span style="font-family: courier new;"&gt;float&lt;/span&gt; и не являются совместимыми с точки зрения присваиваний, они могут легко использоваться в левых и правых частях операторов сравнения, коим и является оператор ==. При этом &lt;span style="font-family: courier new;"&gt;int&lt;/span&gt; 100 приводится к &lt;span style="font-family: courier new;"&gt;float&lt;/span&gt; 100.0 и запросто сравнивается с другим &lt;span style="font-family: courier new;"&gt;float&lt;/span&gt; 100.0F. Поэтому вариант &lt;strong&gt;A&lt;/strong&gt; проходит. В варианте &lt;strong&gt;B&lt;/strong&gt; код не откомпилируется, потому что &lt;span style="font-family: courier new;"&gt;int&lt;/span&gt; и &lt;span style="font-family: courier new;"&gt;Integer&lt;/span&gt; (указатель) не могут быть приведены даже в случае оператора сравнения. В варианте &lt;strong&gt;C&lt;/strong&gt; код компилируется и сравнение может быть проведено. Но выражение &lt;span style="font-family: courier new;"&gt;x == y&lt;/span&gt; сравнивает два различных указателя, и поэтому результат теста равен &lt;span style="font-family: courier new;"&gt;false&lt;/span&gt;. Аналогичные рассыждения можно провести для варианта &lt;strong&gt;D&lt;/strong&gt;. Вариант &lt;strong&gt;E&lt;/strong&gt; кажется эквивалентным варианту &lt;strong&gt;D&lt;/strong&gt;, но это на самом деле не так. В варианте &lt;strong&gt;E&lt;/strong&gt; для строковой константы "100" создаётся объект строкового типа, а &lt;span style="font-family: courier new;"&gt;x&lt;/span&gt; и &lt;span style="font-family: courier new;"&gt;y&lt;/span&gt; являются указателями на этот объект. То есть тест &lt;span style="font-family: courier new;"&gt;(x == y)&lt;/span&gt; равняется &lt;span style="font-family: courier new;"&gt;true&lt;/span&gt; и мы получаем сообщение "Equal".&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: A&lt;/strong&gt;В четвёртой строке кода результат вычисления &lt;span style="font-family: courier new;"&gt;(s.length()&amp;gt;5)&lt;/span&gt; равен &lt;span style="font-family: courier new;"&gt;false&lt;/span&gt; (поскольку длина строки "Hello" равна 5). Таким образом, всё выражения условия&lt;span style="font-family: courier new;"&gt;&lt;strong&gt; if&lt;/strong&gt;&lt;/span&gt; равно &lt;span style="font-family: courier new;"&gt;false&lt;/span&gt;. В результате никаких манипуляций над строкой не производится и она остаётся прежней.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: B&lt;/strong&gt;&lt;br /&gt;Побитовый XOR оператор ^ возвращает 0, если оба биты одинаковы (оба равны 0 или оба равны 1), и 1 - в противном случае. Таким образом 00001010^00001111=00000101, то есть 5 в десятичном исчислении.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: C&lt;/strong&gt;В операторе ?: используются операнды различных типов: 99.99 (&lt;span style="font-family: courier new;"&gt;double&lt;/span&gt;) и 9 (&lt;span style="font-family: courier new;"&gt;int&lt;/span&gt;). Поэтому &lt;span style="font-family: courier new;"&gt;int&lt;/span&gt; приводится к &lt;span style="font-family: courier new;"&gt;double&lt;/span&gt; и результат всего выражения будет типа &lt;span style="font-family: courier new;"&gt;double&lt;/span&gt;. Поскольку &lt;span style="font-family: courier new;"&gt;x = 4&lt;/span&gt;, то тест &lt;span style="font-family: courier new;"&gt;(x &amp;gt; 4)&lt;/span&gt; равен &lt;span style="font-family: courier new;"&gt;false&lt;/span&gt;. Следовательно, результат равен значению после двоеточия, то есть 9.0 (то есть типа &lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace;"&gt;double&lt;/span&gt;).&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: B&lt;/strong&gt;&lt;br /&gt;Вычисление достаточно очевидно, поскольку участвуют только положительные числа. Деление 10 на 3 даёт 3 и в остатке 1, что и является ответом. Если бы мы имели дело с дробными числами, то алгоритм вычисления остатка от деления&lt;span style="font-family: courier new;"&gt; y&lt;/span&gt; на &lt;span style="font-family: courier new;"&gt;x&lt;/span&gt; был бы таким: вычитать &lt;span style="font-family: courier new;"&gt;x&lt;/span&gt; из &lt;span style="font-family: courier new;"&gt;y&lt;/span&gt; до тех пор, пока &lt;span style="font-family: courier new;"&gt;y&lt;/span&gt; не станет меньше &lt;span style="font-family: courier new;"&gt;x&lt;/span&gt;. Как только это случится, &lt;span style="font-family: courier new;"&gt;y&lt;/span&gt; - остаток от деления. Для отрицательных чисел можно забыть о знаках, но иметь в виду, что знак остатка от деления равен знаку делимого (левого операнда). &lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ: A&lt;/strong&gt;Оператор присваивания &lt;span style="font-family: courier new;"&gt;op=&lt;/span&gt; высчитывает левое выражение только один раз. Таким образом, декремент &lt;span style="font-family: courier new;"&gt;--x&lt;/span&gt; происходит только раз и в результате получается 0, а не -1. То есть не возникает никаких ошибок выхода за границы (&lt;em&gt;out-of-bounds&lt;/em&gt;). В нулевой позиции массива находится значение Fred. При этом декремент имеет место перед операцией +=. Хотя объекты типа &lt;span style="font-family: courier new;"&gt;String&lt;/span&gt; не могут изменять своего значения (&lt;em&gt;immutable&lt;/em&gt;), указатели, коими являются элементы массивы, могут изменяться. То есть мы можем создать новый объект в нулевой позиции массива &lt;em&gt;name&lt;/em&gt;, который будет иметь значение "Fred.", то есть строка Fred, заканчивающаяся точкой.&lt;/li&gt;&lt;/span&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-4010138712894405481?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/4010138712894405481/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=4010138712894405481' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/4010138712894405481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/4010138712894405481'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/11/13.html' title='Ответы на тест по операторам (Выпуск 13)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-3549808676556818879</id><published>2008-10-12T15:34:00.000-07:00</published><updated>2008-10-12T16:04:22.125-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='тест'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>Итоги главы 2 и тест по операторам (Выпуск 12)</title><content type='html'>&lt;p&gt;Резюме главы 2 об операторах:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/04/2-4.html"&gt;Унарные операторы: ++ -- + - ! ~&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/04/2-4.html"&gt;Оператор приведения типа: ()&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/04/23.html"&gt;Бинарные арифметические операторы: * / % + -&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/05/24-7.html"&gt;Операторы сдвига: &lt;&lt; &gt;&gt; &gt;&gt;&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/05/25-8.html"&gt;Операторы сравнения: &lt; &lt;= &gt; &gt;= == != instanceof&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/06/26-9.html"&gt;Поразрядные операторы: &amp;amp; ^ &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/08/27-short-circuit-10.html"&gt;Укороченные логические операторы: &amp;amp;&amp;amp; &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/09/11.html"&gt;Условный оператор: ?:&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://javapd.blogspot.com/2008/09/29-11.html"&gt;Операторы присваивания: = op=&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Вы должны знать тип результата унарных и бинарных арифметичских операций, применямых над операндами различных типов.&lt;/p&gt;&lt;p&gt;Различие между равенством объектов и равенством ссылок. Функциональность метода &lt;span style="font-family:courier new;"&gt;equal()&lt;/span&gt; в классах &lt;span style="font-family:courier new;"&gt;Object&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;Boolean&lt;/span&gt; (они сравнивают инкапсулированные данные).&lt;/p&gt;&lt;h3&gt;Тест&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;После выполнения кода ниже каковы будут значения переменных &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt;, и &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt;?&lt;code&gt;&lt;pre&gt;1. int x, a = 6, b = 7;&lt;br /&gt;2. x = a++ + b++;&lt;/code&gt;&lt;code&gt;&lt;/pre&gt;&lt;/code&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;x = 15, a = 7, b = 8&lt;/li&gt;&lt;li&gt;x = 15, a = 6, b = 7&lt;/li&gt;&lt;li&gt;x = 13, a = 7, b = 8&lt;/li&gt;&lt;li&gt;x = 13, a = 6, b = 7&lt;/li&gt;&lt;/ol&gt;&lt;span class="fullpost"&gt;&lt;li&gt;Какие из нижеследующих выражений допустимы? (Выберите все допустимые)&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = 6; x = !x;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = 6; if (!(x &gt; 3)) {}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = 6; x = ~x;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Какие выражения возвратят положительное значение переменной &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt;?&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = -1; x = x &gt;&gt;&gt; 5;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = -1; x = x &gt;&gt;&gt; 32;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;byte x = -1; x = x &gt;&gt;&gt; 5;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = -1; x = x &gt;&gt; 5;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Какие из нижеследующих выражений допустимы? (Выберите все допустимые)&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;String x = “Hello”; int y = 9; x += y;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;String x = “Hello”; int y = 9; if (x == y) {}&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;String x = “Hello”; int y = 9; x = x + y;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;String x = “Hello”; int y = 9; y = y + x;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;String x = null;int y = (x != null) &amp;amp;&amp;amp; (x.length() &gt; 0) ? x.length() : 0;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Какие из нижеследующих выражений откомпилируются и напечатают “&lt;em&gt;Equal&lt;/em&gt;” во время выполнения? (Выберите все допустимые)&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = 100; float y = 100.0F;&lt;br /&gt;if (x == y)&lt;br /&gt;System.out.println("Equal");&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;int x = 100; Integer y = new Integer(100);&lt;br /&gt;if (x == y)&lt;br /&gt;System.out.println("Equal");&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Integer x = new Integer(100);&lt;br /&gt;Integer y = new Integer(100);&lt;br /&gt;if (x == y)&lt;br /&gt;System.out.println("Equal");&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;String x = new String("100");&lt;br /&gt;String y = new String("100");&lt;br /&gt;if (x == y)&lt;br /&gt;System.out.println("Equal");&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;String x = "100"; String y = "100";&lt;br /&gt;if (x == y)&lt;br /&gt;System.out.println("Equal");&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Каков результат выполнения кода ниже?&lt;code&gt;&lt;pre&gt;1. public class Short {&lt;br /&gt;2.     public static void main(String args[]) {&lt;br /&gt;3.         StringBuffer s = new StringBuffer(“Hello”);&lt;br /&gt;4.         if ((s.length() &gt; 5) &amp;amp;&amp;amp;&lt;br /&gt;5.           (s.append(“ there”).equals(“False”)))&lt;br /&gt;6.               ; // do nothing&lt;br /&gt;7.         System.out.println(“value is “ + s);&lt;br /&gt;8.     }&lt;br /&gt;9. }&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Hello&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Hello there&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Ошибка компиляции в 4-й или 5-й строке&lt;/li&gt;&lt;li&gt;Ничего не выводится&lt;/li&gt;&lt;li&gt;Исключение &lt;span style="font-family:courier new;"&gt;NullPointerException&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Каков результат выполнения кода ниже?&lt;code&gt;&lt;pre&gt;1. public class Xor {&lt;br /&gt;2.     public static void main(String args[]) {&lt;br /&gt;3.         byte b = 10; // 00001010 binary&lt;br /&gt;4.         byte c = 15; // 00001111 binary&lt;br /&gt;5.         b = (byte)(b ^ c);&lt;br /&gt;6.         System.out.println(“b contains ” + b);&lt;br /&gt;7.     }&lt;br /&gt;8. }&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;b contains 10&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;b contains 5&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;b contains 250&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;b contains 245&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Каков результат компиляции и выполнения кода ниже?&lt;code&gt;&lt;pre&gt;1. public class Conditional {&lt;br /&gt;2.     public static void main(String args[]) {&lt;br /&gt;3.         int x = 4;&lt;br /&gt;4.         System.out.println(“value is “ +&lt;br /&gt;5.           ((x &gt; 4) ? 99.99 : 9);&lt;br /&gt;6.     }&lt;br /&gt;7. }&lt;/code&gt;&lt;code&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;value is 99.99&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;value is 9&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;value is 9.0&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Ошибка компиляции в пятой строке&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Каков результат выполнения кода ниже?&lt;code&gt;&lt;pre&gt;1. int x = 3; int y = 10;&lt;br /&gt;2. System.out.println(y % x);&lt;/code&gt;&lt;code&gt;&lt;/pre&gt;&lt;/code&gt;&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;0&lt;/li&gt;&lt;li&gt;1&lt;/li&gt;&lt;li&gt;2&lt;/li&gt;&lt;li&gt;3&lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Каков результат выполнения кода ниже?&lt;code&gt;&lt;pre&gt;1. int x = 1;&lt;br /&gt;2. String [] names = { “Fred”, “Jim”, “Sheila” };&lt;br /&gt;3. names[--x] += “.”;&lt;br /&gt;4. for (int i = 0; i &lt; names.length; i++) {&lt;br /&gt;5.     System.out.println(names[i]);&lt;br /&gt;6. }&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;ol style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Fred.\nJim\nSheila&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Fred\nJim.\nSheila &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Fred\nJim\nSheila. &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;Fred\nJim\nSheila&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Исключение &lt;span style="font-family:courier new;"&gt;ArrayIndexOutOfBoundsException&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-3549808676556818879?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/3549808676556818879/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=3549808676556818879' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/3549808676556818879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/3549808676556818879'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/10/2-12.html' title='Итоги главы 2 и тест по операторам (Выпуск 12)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-9058051489948981232</id><published>2008-09-24T02:52:00.000-07:00</published><updated>2008-09-24T03:20:55.567-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='присваивание'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>2.9 Оператор присваивания (Выпуск 11)</title><content type='html'>&lt;p&gt;&lt;em&gt;Операторы присваивания&lt;/em&gt; устанавливают значение переменной или выражения в новое значение. Присваивание поддерживается рядом других операторов. Простое присваивание использует знак "=". Такие операторы, как, например, "*=", "+=" выполняют композиционную функцию, имеющую значение "вычислить и присвоить". Такие композиционные операторы имеют общую форму &lt;em&gt;op=&lt;/em&gt;, где &lt;em&gt;op&lt;/em&gt; - любой бинарный небулевый оператор, рассмотренный в &lt;a href="http://javapd.blogspot.com/search/label/%D0%B3%D0%BB%D0%B0%D0%B2%D0%B0%202"&gt;данной главе&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Для любых выражений &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;y&lt;/span&gt; совместимого типа выражение &lt;span style="font-family:courier new;"&gt;x &lt;em&gt;op&lt;/em&gt;= y&lt;/span&gt; является эквиваленным выражению &lt;span style="font-family:courier new;"&gt;x = x &lt;em&gt;op&lt;/em&gt; y&lt;/span&gt;. Но есть и отличия:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;В первом случае &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; вычисляется только раз, а не два раза, как во втором, традиционном, случае.&lt;/li&gt;&lt;li&gt;Оператор присваивания содержит в себе неявное приведение типов.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Например:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. byte x = 2;&lt;br /&gt;2. x += 3;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;В расширенном варианте это выглядит так:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. byte x = 2;&lt;br /&gt;2. x = (byte)(x + 3);&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Использование приведения типа к &lt;span style="font-family:courier new;"&gt;byte&lt;/span&gt; необходимо, потому что результат целочисленного сложения имеет по меньшей мере тип &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt;. В первом же случае, приведение типов &lt;em&gt;неявное&lt;/em&gt;.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;div style="BORDER-RIGHT: green 2px dotted; PADDING-RIGHT: 5px; BORDER-TOP: green 2px dotted; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px; BORDER-LEFT: green 2px dotted; PADDING-TOP: 5px; BORDER-BOTTOM: green 2px dotted"&gt;Выражение &lt;span style="font-family:courier new;"&gt;x+=2&lt;/span&gt; всего лишь на два символа короче своей расширенной формы &lt;span style="font-family:courier new;"&gt;x = x + 2&lt;/span&gt;. Но представьте себе, что &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; имеет более сложный вид, например:&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;target[temp.calculateOffset(1.9F) + depth++].item&lt;/span&gt;. И тогда читаемость этого выражения существенно возрастает!&lt;/div&gt;&lt;h3&gt;Любое присваивание обладает значением&lt;/h3&gt;&lt;p&gt;Все операторы, которые мы обсудили в &lt;a href="http://javapd.blogspot.com/search/label/%D0%B3%D0%BB%D0%B0%D0%B2%D0%B0%202"&gt;данной главе&lt;/a&gt; возвращают некое значение в результате выполнения операции. Например, выражение 1+2 возвращает значение 3 в результате выполнения операции сложения. И это значение может быть использовано на следующих шагах программы, например, оно может быть присвоено некоторой переменной. &lt;em&gt;Оператор присваивания также возвращает значение&lt;/em&gt;. Например, если нам даны три переменные &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt;, то допустимо выражение &lt;span style="font-family:courier new;"&gt;a = b = c = 0&lt;/span&gt;. Это выражение вычисляется &lt;em&gt;справа налево&lt;/em&gt;, то есть ноль сначала присваивается переменной &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt;. И присваивание возвращает значение 0, которое присваивается переменной &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt;. А потом аналогичным образом ноль присваивается переменной &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt;.&lt;/p&gt;&lt;div style="BORDER-RIGHT: green 2px dotted; PADDING-RIGHT: 5px; BORDER-TOP: green 2px dotted; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px; BORDER-LEFT: green 2px dotted; PADDING-TOP: 5px; BORDER-BOTTOM: green 2px dotted"&gt;&lt;em&gt;Порядок выполнения&lt;/em&gt;, который определяется приоритеностью операторов и законами ассоциативности, не равен &lt;em&gt;порядку вычисления&lt;/em&gt;. Старайтесь разбивать сложные выражения на последовательность более простых, чтобы повысить читаемость вашего кода. В любом случае, компилятор соптимизирует их наиболее эффективным образом.&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-9058051489948981232?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/9058051489948981232/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=9058051489948981232' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/9058051489948981232'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/9058051489948981232'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/09/29-11.html' title='2.9 Оператор присваивания (Выпуск 11)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-6113427868928740274</id><published>2008-09-24T02:29:00.000-07:00</published><updated>2008-09-24T02:52:54.371-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='условный оператор'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>2.8 Условный оператор ? : (Выпуск 11)</title><content type='html'>&lt;p&gt;Условный оператор &lt;em&gt;? :&lt;/em&gt;, известный также, как &lt;em&gt;тройной&lt;/em&gt; оператор позволяет закодировать условие &lt;span style="font-family:courier new;"&gt;if/else&lt;/span&gt; в одну строку. Если условие истинно, то результат - левое выражение от двоеточия, иначе - правое. Заметьте, что выражения слева и справа от двоеточия должны быть приводимы к типу переменной, к которой эти выражения присваиваются. Например, пусть &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; - это переменные типа &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt;, а &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; - переменная типа &lt;span style="font-family:courier new;"&gt;boolean&lt;/span&gt;. Тогда выражение &lt;span style="font-family:courier new;"&gt;a = x ? b : c&lt;/span&gt; эквивалентно следующему фрагменту кода:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. if (x) {&lt;br /&gt;2.     a = b;&lt;br /&gt;3. }&lt;br /&gt;4. else {&lt;br /&gt;5.     a = c;&lt;br /&gt;6. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Конечно, вместо &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt;, &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; могут быть использованы выражения гораздо более сложного вида.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;div style="BORDER-RIGHT: blue 2px dotted; PADDING-RIGHT: 5px; BORDER-TOP: blue 2px dotted; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px; BORDER-LEFT: blue 2px dotted; PADDING-TOP: 5px; BORDER-BOTTOM: blue 2px dotted"&gt;Некоторые не любят условный оператор и в некоторых компаниях он и вовсе запрещён к использованию внутренними правилами компании. Да, этот оператор позволяет создавать компактный код. Но в большинстве случаев компилятор сгенерирует такой же компактный и эффективный код из более понятной конструкции &lt;span style="font-family:courier new;"&gt;if/else&lt;/span&gt;. Кроме того, приятный и компактный условный оператор приобретает иной лик, если использовать его несколько раз во вложенном виде, например:&lt;code&gt;&lt;pre&gt;a = b ? c ? d : e ? f : g : h ? i : j ? k : l;&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Резюмируем тонкости использования условного оператора на примере выражения a = x ? b : c:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Типы выражений &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; должны быть совместимыми и даже идентичными, если их привести.&lt;/li&gt;&lt;li&gt;Тип выражения &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; должен быть &lt;span style="font-family:courier new;"&gt;boolean&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Типы выражений &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; должны быть совместимыми с типом переменной &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Переменной &lt;span style="font-family:courier new;"&gt;a&lt;/span&gt; присваивается &lt;span style="font-family:courier new;"&gt;b&lt;/span&gt;, если &lt;span style="font-family:courier new;"&gt;x = true&lt;/span&gt;, и &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; - в противном случае (&lt;span style="font-family:courier new;"&gt;x = false&lt;/span&gt;).&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-6113427868928740274?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/6113427868928740274/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=6113427868928740274' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/6113427868928740274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/6113427868928740274'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/09/11.html' title='2.8 Условный оператор ? : (Выпуск 11)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-8486092270308841793</id><published>2008-08-20T02:02:00.000-07:00</published><updated>2010-11-28T03:07:40.901-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='and'/><category scheme='http://www.blogger.com/atom/ns#' term='or'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>2.7 Укороченные (short-circuit) логические операторы (Выпуск 10)</title><content type='html'>Укороченные (short-circuit) логические операторы &amp;amp;&amp;amp; и || предназначаются для логических AND (И) и OR (ИЛИ) операций над выражениями типа &lt;span style="font-family: courier new;"&gt;boolean&lt;/span&gt;. Заметьте, что для XOR (исключающее ИЛИ) операции не существует укороченного логического оператора.&lt;br /&gt;&lt;br /&gt;Укороченные логические операторы похожи на операторы &amp;amp; и |, но в отличие от них применяются &lt;strong&gt;только&lt;/strong&gt; к выражениям типа &lt;span style="font-family: courier new;"&gt;boolean&lt;/span&gt; и никогда не применяются к интегральным типам. Тем не менее, &amp;amp;&amp;amp; и || обладают замечательным свойством: они укорачивают вычисление выражения, если результат может быть дедуцирован из части выражения (чуть позже я поясню это на примерах). Благодаря этому свойству, операторы &amp;amp;&amp;amp; и || широко используются для обработки null-выражений. Они также помогают увеличить эффективность всей программы.&lt;br /&gt;&lt;br /&gt;Свойство укорачивания вытекает прямым образом из различий между &amp;amp;&amp;amp;/|| и &amp;amp;/|: последняя пара операторов должна получать на вход значения левого и правого операторов, в то время как для первой пары операторов иногда достаточно знать значение только левого операнда, чтобы вернуть значение всего выражения. Такое поведение укороченных логических операторов базируется на двух математических правилах &lt;a href="http://javapd.blogspot.com/2008/06/26-9.html"&gt;логической таблицы истинности&lt;/a&gt;:&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;выражение с AND оператором ложно (&lt;span style="font-family: courier new;"&gt;false&lt;/span&gt;), если значение хотя бы одного из его операндов ложно;&lt;/li&gt;&lt;li&gt;выражение с OR оператором истинно (&lt;span style="font-family: courier new;"&gt;true&lt;/span&gt;), если значение хотя бы одного из его операндов истинно.&lt;/li&gt;&lt;/ul&gt;Иными словами:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;false AND X = false&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: courier new;"&gt;true OR X = true&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;То есть, если левый операнд AND выражения ложен, то и всё выражение ложно, вне зависимости от значения правого операнда. То есть при ложном левом операнде нет нужны вычислять значение правого операнда. Аналогичным образом, если левый операнд OR выражения истиннен, то истинно и всё выражения, вне зависимости от значения правого операнда, которое, следовательно, нам не нужно вычислять.&lt;br /&gt;&lt;br /&gt;Рассмотрим пример кода, который выводит сообщение &lt;span style="font-family: courier new;"&gt;String&lt;/span&gt;, если строка не нулевая и более 20 символов длиной:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;1. if ((s != null) &amp;amp;&amp;amp; (s.length() &amp;gt; 20)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(s);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;3. }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;Эта же задача может быть закодиравана по-другому: &lt;br /&gt;&amp;nbsp; &lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;1. if (s != null) { &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;2.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (s.length() &amp;gt; 20) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;3.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.out.println(s);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;4.&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;, Courier, monospace; font-size: x-small;"&gt;5. }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;/code&gt;Если бы строка &lt;span style="font-family: courier new;"&gt;s&lt;/span&gt; была &lt;span style="font-family: courier new;"&gt;null&lt;/span&gt;, то при вызове метода &lt;span style="font-family: courier new;"&gt;s.length()&lt;/span&gt; мы бы получили &lt;span style="font-family: courier new;"&gt;NullPointerException&lt;/span&gt;. Ни в одном из двух примеров кода, однако, такая ситауция не возникнет. В частности, во втором примере, &lt;span style="font-family: courier new;"&gt;s.length()&lt;/span&gt; не вызывается при &lt;span style="font-family: courier new;"&gt;s = null&lt;/span&gt;, благодаря использованию укороченного оператора &amp;amp;&amp;amp;. Если бы тест &lt;span style="font-family: courier new;"&gt;(s!=null)&lt;/span&gt; возвращал ложь (&lt;span style="font-family: courier new;"&gt;false&lt;/span&gt;), то есть &lt;span style="font-family: courier new;"&gt;s&lt;/span&gt; - несуществующая строка, то и всё выражение гарантированно ложно. Значит, отпадает необхеодимость вычислять значение второго операнда, то есть выражения &lt;span style="font-family: courier new;"&gt;(s.length()&amp;gt;20)&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;Однако данные операторы имеют побочные эффекты. Например, если правый операнд является выражением, выполняющим некую операцию, то при применении укороченных операторов, эта операция может оазаться невыполненной в случае ложного левого операнда. &lt;br /&gt;&lt;br /&gt;Рассмотрим пример:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;// первый пример&lt;br /&gt;1. int val = (int)(2 * Math.random());&lt;br /&gt;2. boolean test = (val == 0) || (++val == 2);&lt;br /&gt;3. System.out.println(“test = “ + test + “\nval = “ + val);&lt;br /&gt;&lt;br /&gt;// второй пример&lt;br /&gt;1. int val = (int)(2 * Math.random());&lt;br /&gt;2. boolean test = (val == 0)|(++val == 2);&lt;br /&gt;3. System.out.println(“test = “ + test + “\nval = “ + val);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Первый пример иногда будет выводить на печать вот это:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;code&gt;test = true&lt;br /&gt;val = 0&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;А иногда вот это:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;code&gt;test = true&lt;br /&gt;val = 2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Второй пример иногда будет выводить на печать вот это:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;code&gt;test = true&lt;br /&gt;val = 1&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;А иногда вот это:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&lt;/code&gt;&amp;nbsp;&lt;/pre&gt;&lt;code&gt;test = true&lt;br /&gt;val = 2&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;А дело вот в чём. Если &lt;span style="font-family: courier new;"&gt;val&lt;/span&gt; равно 0, то второй операнд &lt;span style="font-family: courier new;"&gt;(++val)&lt;/span&gt; никогда не будет вычислен, то есть &lt;span style="font-family: courier new;"&gt;val&lt;/span&gt; останется равным нулю. Если же изначально &lt;span style="font-family: courier new;"&gt;val&lt;/span&gt; равен единице, то в результате эта переменная будет инкрементирована и мы увидим &lt;span style="font-family: courier new;"&gt;val = 2&lt;/span&gt;. Во втором примере, при использовании &lt;strong&gt;не&lt;/strong&gt;укороченных операторов, инкремент выполняется всегда и результат будет всегда или 1 или 2 в зависимости от случайного значения выбранного на первом шаге. В обоих примерах переменная &lt;span style="font-family: courier new;"&gt;test&lt;/span&gt; принимает значение &lt;span style="font-family: courier new;"&gt;true&lt;/span&gt;, потому что либо &lt;span style="font-family: courier new;"&gt;val = 0&lt;/span&gt;, либо &lt;span style="font-family: courier new;"&gt;val = 1&lt;/span&gt; и инкрементируется до значения 2.&lt;br /&gt;&lt;br /&gt;Резюмируем информацию об укороченных операторах &amp;amp;&amp;amp; и ||:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Они применяются к операндам типа &lt;span style="font-family: courier new;"&gt;boolean&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;Они вычисляют значение правого операнда только если результат не может быть вычислен на основании значения левого операнда: &lt;/li&gt;&lt;ul&gt;&lt;li&gt;false AND X = false&lt;/li&gt;&lt;li&gt;true OR X = true&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-8486092270308841793?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/8486092270308841793/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=8486092270308841793' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/8486092270308841793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/8486092270308841793'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/08/27-short-circuit-10.html' title='2.7 Укороченные (short-circuit) логические операторы (Выпуск 10)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-5270013005594863307</id><published>2008-06-29T05:53:00.000-07:00</published><updated>2008-06-29T06:59:03.301-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='download'/><title type='text'>Откуда скачать Java (Выпуск 9)</title><content type='html'>&lt;p&gt;Получила первое письмо от читателя рассылки, в котором вопрос: откуда скачать Java. Скачать Java очень просто:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Идём на сайт &lt;a href="http://java.sun.com/"&gt;java.sun.com&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;На открывшейся странице в верхней менюшке наводим курсором на &lt;em&gt;Downloads&lt;/em&gt; и из выпадающей менюшке выбираем &lt;em&gt;Java SE &lt;/em&gt;(подсвечено оранжевым на рисунке ниже).&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://i245.photobucket.com/albums/gg69/microstocker/java09/Java_01.gif" /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;На открывшейся странице (см. рис. ниже) нам нужно выбрать (кнопка &lt;em&gt;Download&lt;/em&gt;) &lt;em&gt;JDK 6 Update 6&lt;/em&gt; (отмечено красным).&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://i245.photobucket.com/albums/gg69/microstocker/java09/Java_02.gif" /&gt;&lt;/div&gt;&lt;/li&gt;&lt;span class="fullpost"&gt;&lt;li&gt;На открывшейся странице необходимо выбрать платформу (Windows, Linux и т.д.). И опция &lt;em&gt;Multi-language&lt;/em&gt;, по-моему, там единственная. Отметьте также галочкой &lt;em&gt;License Agreement&lt;/em&gt; и нажмите оранжевую кнопку &lt;em&gt;Continue&lt;/em&gt;.&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://i245.photobucket.com/albums/gg69/microstocker/java09/Java_03.gif" /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Наконец мы добрались до ссылки на скачивание. При этом вы можете выбрать либо пакет для он-лайн инсталляции, либо пакет для офф-лайн инсталляции. Он-лайн инсталляция, конечно, занимает мало (0.36Мб)по сравнению со вторым пакетом (71.49Мб), но это только кажимость. Всё равно все недостающие компоненты будут подкачиваться из интернета в процессе инсталляции. Так что все 70 мег вам так или иначе придётся скачать. Единственная разница в том, что в первом случае (он-лайн инсталляция) вы ещё окажетесь связанными по рукам, если вдруг у вса не окажется под рукой интернета при переустановки джавы. Так что я рекомендую скачивать офф-лайн инсталляцию (отмечено красным карандашом на рис. ниже).&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://i245.photobucket.com/albums/gg69/microstocker/java09/Java_04.gif" /&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Скачиваемый файл в моём случае (винда) называется jdk-6u6-windows-i586-p.exe. И я егос охранила на диск (&lt;em&gt;Salva&lt;/em&gt;, &lt;em&gt;Save&lt;/em&gt;).&lt;br /&gt;&lt;div align="center"&gt;&lt;img src="http://i245.photobucket.com/albums/gg69/microstocker/java09/Java_05.gif" /&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;p&gt;Скачивание длилось у меня где-то 10 минут. &lt;/p&gt;&lt;p&gt;Потом нужно просто запустить скачанный файл. Установится JRE (&lt;em&gt;Java Run-time Edition&lt;/em&gt;), то есть всё то, что необходимо для функционирования джавы под платформу, выбранную на шаге 4. А также устанится JDK (&lt;em&gt;Java Development Kit&lt;/em&gt;), то есть всё, что нужно для программирования: документация, библиотеки, примеры...&lt;br /&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-5270013005594863307?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/5270013005594863307/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=5270013005594863307' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/5270013005594863307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/5270013005594863307'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/06/java-9.html' title='Откуда скачать Java (Выпуск 9)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://i245.photobucket.com/albums/gg69/microstocker/java09/th_Java_01.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-7462540537672253556</id><published>2008-06-29T03:09:00.000-07:00</published><updated>2008-06-29T04:23:18.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='and'/><category scheme='http://www.blogger.com/atom/ns#' term='or'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><category scheme='http://www.blogger.com/atom/ns#' term='xor'/><title type='text'>2.6 Поразрядные операторы: &amp;, ^ и | (Выпуск 9)</title><content type='html'>&lt;p&gt;Поразрядные операторы &amp;amp;, ^ и используются для выполнения побитовых операций AND, XOR и OR соответственно. Они применяются к целочисленным типам. Набор битов является эффективным средством экономии памяти, когда некое состояние (например, данные физических устройств) необходимо представить в виде вектора значений типа &lt;span style="font-family:courier new;"&gt;boolean&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Результат применения операторов &amp;amp;, ^ и к двум операндам описывается таблицами 1, 2 и 3 соответственно.&lt;/p&gt;&lt;center&gt;Таблица 1: Операция AND&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Операнд&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;&lt;th&gt;Операнд&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;&lt;th&gt;Операнд&lt;sub&gt;1&lt;/sub&gt; AND Операнд&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;center&gt;Таблица 2: Операция OR&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Операнд&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;&lt;th&gt;Операнд&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;&lt;th&gt;Операнд&lt;sub&gt;1&lt;/sub&gt; OR Операнд&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;br /&gt;&lt;br /&gt;&lt;center&gt;Таблица 3: Операция XOR&lt;br /&gt;&lt;table border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;Операнд&lt;sub&gt;1&lt;/sub&gt;&lt;/th&gt;&lt;th&gt;Операнд&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;&lt;th&gt;Операнд&lt;sub&gt;1&lt;/sub&gt; XOR Операнд&lt;sub&gt;2&lt;/sub&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td&gt;&lt;p align="center"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;br /&gt;&lt;p&gt;Для AND операции результат будет истинным (1), если оба операнда истинны. Для OR оператора результат истинный, если хотя бы один операнд истинный. Для XOR оператора результат истинный, если один и только один (не оба!) операнд истинный. XOR - это исключающий (&lt;em&gt;e&lt;strong&gt;X&lt;/strong&gt;clusive&lt;/em&gt;) OR.&lt;/p&gt;&lt;p&gt;Сейчас мы рассмотрим работу этих операторов не над одним единственным битом, но над битовым представлением числа.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Пример 1.&lt;/em&gt;&lt;/p&gt;&lt;div style="FLOAT: left; MARGIN-RIGHT: 20px"&gt;&lt;pre&gt;    00110011&lt;br /&gt;    11110000&lt;br /&gt;AND --------&lt;br /&gt;    00110000&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Посмотрите, как каждый бит результата считается на основе битов на соответсвующих позициях двух операндов. Первые биты двух операндов равны 0 и 1, значит первый бит результата равен 0 согласно Таблице 1. Третьи биты равны 1 и 1, значит результат равен 1. Пятые биты равный 0 и 0, значит результат равен 0. Последние биты равны 1 и 0, значит результат равен 0.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Пример 2.&lt;/em&gt;&lt;/p&gt;&lt;div style="FLOAT: left; MARGIN-RIGHT: 50px"&gt;&lt;pre&gt;    00110011&lt;br /&gt;    11110000&lt;br /&gt;XOR --------&lt;br /&gt;    11000011&lt;/pre&gt;&lt;/div&gt;&lt;div style="FLOAT: left; MARGIN-RIGHT: 20px"&gt;&lt;pre&gt;   00110011&lt;br /&gt;   11110000&lt;br /&gt;OR --------&lt;br /&gt;   11110011&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Для вычисления результата операций XOR и OR необходимо воспользоваться таблицами 3 и 2 соответсвенно для соответсвующих разрядов первого (верхнего) и второго (нижнего) операндов. Заметьте, что операции AND, OR, XOR коммутативны, то есть результат изменится прежним, даже если мы поменяем операнды местами.&lt;/p&gt;&lt;p&gt;Аналогичным образом таблицы 1, 2, 3 можно применить и к значениям типа &lt;span style="font-family:courier new;"&gt;boolean&lt;/span&gt;, где 1 - &lt;span style="font-family:courier new;"&gt;true&lt;/span&gt;, 0 - &lt;span style="font-family:courier new;"&gt;false&lt;/span&gt;. При этом операнды должны быть булевого типа (например, &lt;span style="font-family:courier new;"&gt;a==10&lt;/span&gt;) и операторы &amp;amp;, ^ и применяются не побитово, а ко всему булевому выражению.&lt;/p&gt;&lt;div style="BORDER-RIGHT: red 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: red 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: red 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: red 1px dotted"&gt;Оба операнда должны быть либо целочисленного типа (и тогда операторы &amp;amp;, ^ и применяются поразрядно), либо булевого типа (и тогда операторы применяются ко всему выражению). В Java нельзя привести тип к &lt;span style="font-family:courier new;"&gt;boolean&lt;/span&gt;. Вместо этого необходимо использовать булевы выражения, например, &lt;a href="http://javapd.blogspot.com/2008/05/25-8.html"&gt;сравнения&lt;/a&gt;.&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-7462540537672253556?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/7462540537672253556/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=7462540537672253556' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/7462540537672253556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/7462540537672253556'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/06/26-9.html' title='2.6 Поразрядные операторы: &amp;, ^ и | (Выпуск 9)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-8681854374497211202</id><published>2008-05-28T11:37:00.000-07:00</published><updated>2008-05-28T15:12:15.763-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hashCode'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='instanceof'/><category scheme='http://www.blogger.com/atom/ns#' term='сравнение'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><category scheme='http://www.blogger.com/atom/ns#' term='equals'/><title type='text'>2.5 Операторы сравнения (Выпуск 8)</title><content type='html'>&lt;p&gt;Операторы сравнения, &amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, ==, !=, возвращают результат типа &lt;span style="font-family:courier new;"&gt;boolean&lt;/span&gt;, то есть &lt;span style="font-family:courier new;"&gt;true&lt;/span&gt; или &lt;span style="font-family:courier new;"&gt;false&lt;/span&gt;. Эти операторы обычно используются в условных конструкциях (например, &lt;span style="font-family:courier new;"&gt;if&lt;/span&gt; () или циклы). Существует три типа сравнения:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;порядковое&lt;/em&gt; (ordinal) тестирует относительные значения числовых операндов.&lt;/li&gt;&lt;li&gt;&lt;em&gt;объектно-ориентированное&lt;/em&gt; определяет тип объекта во время исполнения программы.&lt;/li&gt;&lt;li&gt;операторы &lt;em&gt;равенства&lt;/em&gt; тестируют, одинаковы ли два значения, в том числе и нечисленные.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Рассмотрим их все подробнее. &lt;p&gt;&lt;/p&gt;&lt;h3&gt;Порядковые операторы (&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=)&lt;/h3&gt;&lt;p&gt;К порядковым операторам относятся &amp;lt; (меньше), &amp;gt; (больше), &amp;lt;= (меньше либо равно), &amp;gt;= (больше либо равно). Они применяются ко всем численным типам и типу &lt;span style="font-family:courier new;"&gt;char&lt;/span&gt; и возвращают результат &lt;span style="font-family:courier new;"&gt;boolean&lt;/span&gt;. Например, если у нас имеются следующие объявления:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;int p = 9;&lt;br /&gt;int q = 65;&lt;br /&gt;int r = -12;&lt;br /&gt;float f = 9.0F;&lt;br /&gt;char c = ‘A’;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;то следующие тесты возвратят &lt;span style="font-family:courier new;"&gt;true&lt;/span&gt;:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;p &amp;lt; q&lt;br /&gt;f &amp;lt; q&lt;br /&gt;f &amp;lt;= c&lt;br /&gt;c &amp;gt; r&lt;br /&gt;c &amp;gt;= q&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Заметьте, что, когда эти операторы используются, применяется &lt;a href="http://javapd.blogspot.com/2008/05/24-7.html"&gt;арифметическое распространение&lt;/a&gt;. Например, будет ошибкой присвоение значение &lt;span style="font-family:courier new;"&gt;9.0F&lt;/span&gt; типа &lt;span style="font-family:courier new;"&gt;float&lt;/span&gt; переменной &lt;span style="font-family:courier new;"&gt;c&lt;/span&gt; типа &lt;span style="font-family:courier new;"&gt;char&lt;/span&gt;. Но к этой паре может быть применено сравнение! Для этого Java распространяет меньший тип к большему типу. То есть значение &lt;span style="font-family:courier new;"&gt;'A'&lt;/span&gt; типа &lt;span style="font-family:courier new;"&gt;char&lt;/span&gt; (представляемое значением 65 в Unicode) распространяется до &lt;span style="font-family:courier new;"&gt;float 65.0F&lt;/span&gt;. Сравнение затем выполняется на результирующей паре значений &lt;span style="font-family:courier new;"&gt;float&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Порядковые сравнения не могут быть применены к объектным типам!&lt;/strong&gt;&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;h3&gt;Оператор &lt;em&gt;instanceof&lt;/em&gt;&lt;/h3&gt;&lt;p&gt;Оператор &lt;span style="font-family:courier new;"&gt;instanceof&lt;/span&gt; тестирует класс объекта в момент исполнения программы (&lt;em&gt;runtime&lt;/em&gt;). Левый операнд - любое выражение объектного типа (переменная или массив). Правый операнд - имя класса, интерфейса или массивный тип. Однако, левым операндом не может быть объект типа &lt;span style="font-family:courier new;"&gt;java.lang.Class&lt;/span&gt;, а правым операндом не может быть &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Фрагмент кода ниже показывает пример использования оператора &lt;span style="font-family:courier new;"&gt;instanceof&lt;/span&gt;. Предположим, что существует класс &lt;span style="font-family:courier new;"&gt;Person&lt;/span&gt; с подклассом &lt;span style="font-family:courier new;"&gt;Parent&lt;/span&gt;:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;1. public class Classroom {&lt;br /&gt;2.     private Hashtable inTheRoom = new Hashtable();&lt;br /&gt;3.     public void enterRoom(Person p) {&lt;br /&gt;4.         inTheRoom.put(p.getName(), p);&lt;br /&gt;5.     }&lt;br /&gt;6.     public Person getParent(String name) {&lt;br /&gt;7.         Object p = inTheRoom.get(name);&lt;br /&gt;8.         if (p instanceof Parent) {&lt;br /&gt;9.             return (Parent)p;&lt;br /&gt;10.        }&lt;br /&gt;11.        else {&lt;br /&gt;12.            return null;&lt;br /&gt;13.        }&lt;br /&gt;14.    }&lt;br /&gt;15. }&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Метод &lt;span style="font-family:courier new;"&gt;getParent()&lt;/span&gt; в строках 6-14 проверяет, содержит ли &lt;span style="font-family:courier new;"&gt;Hashtable&lt;/span&gt; родителя со специфическим именем. Для этого в &lt;span style="font-family:courier new;"&gt;Hashtable&lt;/span&gt; сначал ищется элемент со специфическим именем родителя. А потом проверяется, является ли этот элемент объектом типа &lt;span style="font-family:courier new;"&gt;Parent&lt;/span&gt;. Оператор &lt;span style="font-family:courier new;"&gt;instanceof&lt;/span&gt; проверяет, совпадает ли класс левого операнда с названием класса, заданного правым операндом или является его подклассом.&lt;/p&gt;&lt;p&gt;Правый операнд также может быть и названием интерфейса. И в этом случае оператор определяет, имплементирует ли левый аргумент данный интерфейс.&lt;/p&gt;&lt;p&gt;Опертор также используется для тестирования, является ли объект массивом. Поскольку &lt;em&gt;массивы в Java являются объектами&lt;/em&gt;, то такое тестирование логично. Но тест проводится в два шага: (1) является ли объект массивом и (2) является ли тип элементов массива (под)классом правого аргумента. Это отражает идею, что массив, скажем, объектов типа &lt;span style="font-family:courier new;"&gt;Button&lt;/span&gt; (кнопки) является массивом объектов типа &lt;span style="font-family:courier new;"&gt;Component&lt;/span&gt; (компоненты), поскольку &lt;span style="font-family:courier new;"&gt;Button&lt;/span&gt; - это &lt;span style="font-family:courier new;"&gt;Component&lt;/span&gt;. Тест для такого массива будет выглядеть так:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;if (x instanceof Component[])&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Заметьте, что невозможно провести тестирование для "любого массива с элементами любого типа". То есть следующая строка недопустима:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;if (x instanceof [])&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;Недопустимо также тестирование на массив с элементами типа &lt;span style="font-family:courier new;"&gt;Object&lt;/span&gt;:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;if (x instanceof Object [])&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;поскольку элементы массива могут быть примитивного типа и тест, попросту, не сработает.&lt;/p&gt;&lt;div style="BORDER-RIGHT: red 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: red 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 10px; BORDER-LEFT: red 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: red 1px dotted"&gt;&lt;p&gt;А как же протестировать, является ли объект массивом без привязки к типу его элементов? Допустим &lt;span style="font-family:courier new;"&gt;myObject&lt;/span&gt; это массив. Тогда следующая строка возвратит &lt;span style="font-family:courier new;"&gt;true&lt;/span&gt;:&lt;/p&gt;&lt;code&gt;&lt;pre&gt;myObject.getClass().isArray()&lt;/pre&gt;&lt;/code&gt;&lt;/div&gt;&lt;p&gt;Если левый операнд равен &lt;span style="font-family:courier new;"&gt;null&lt;/span&gt;, то &lt;span style="font-family:courier new;"&gt;instanceof&lt;/span&gt; возвратит &lt;span style="font-family:courier new;"&gt;false&lt;/span&gt;. Никокого исключения не возникнет.&lt;/p&gt;&lt;h3&gt;Операторы равенства (== и !=)&lt;/h3&gt;&lt;p&gt;Операторы == и != тестируют, соответственно, равенство или неравенство. Для примитивных типов концепция равенства или неравенства достаточно тривиальна. Как и в случае с операторами порядка, операнды распространяются до наибольшего. Например, значение 10.0 типа &lt;span style="font-family:courier new;"&gt;float&lt;/span&gt; равно значению 10 типа &lt;span style="font-family:courier new;"&gt;byte&lt;/span&gt;. Для значений объектного типа, сравниваемая величина - это ссылка на объект, то есть адрес памяти.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Никогда не используйте операторы равенства для сравнения объектных типов &lt;/strong&gt;(например строк)&lt;strong&gt;!&lt;/strong&gt; Потому что они возвращают &lt;span style="font-family:courier new;"&gt;true&lt;/span&gt; только если адрес памяти совпадает, а не поля объектов совпадают. &lt;strong&gt;Для сравнения объектов используется метод &lt;span style="font-family:courier new;"&gt;equals().&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style="BORDER-RIGHT: red 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: red 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 10px; BORDER-LEFT: red 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: red 1px dotted"&gt;Метод &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; должен был определён в классе сравниваемых объектов. Чтобы быть уверенными в этом, проверьте документацию. В документации должно быть указано, что &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; определён в классе или переопределяет (&lt;em&gt;overrides&lt;/em&gt;) метод &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; своего супер-класса. Если документация ничего по этому поводу не говорит, то метод &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; будет, скорее всего, работать неправильно. Метод &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; принимает аргумент типа &lt;span style="font-family:courier new;"&gt;Object&lt;/span&gt;. Но в реальности вы должны передавать ему аргумент того же типа, что и объект, для которого он вызывается. Например, если вы вызываете &lt;span style="font-family:courier new;"&gt;x.equals(y)&lt;/span&gt;, то &lt;span style="font-family:courier new;"&gt;y instanceof x&lt;/span&gt; должно возвращать &lt;span style="font-family:courier new;"&gt;true&lt;/span&gt;. Если же это не так, то &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; вернёт &lt;span style="font-family:courier new;"&gt;false&lt;/span&gt;.&lt;/div&gt;&lt;div style="BORDER-RIGHT: blue 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: blue 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 10px; BORDER-LEFT: blue 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: blue 1px dotted"&gt;Если вы определяете &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; в вашем собственном классе, то вы должны соблюдать три правила: &lt;ul&gt;&lt;li&gt;Аргумент для &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; должен быть объект типа &lt;span style="font-family:courier new;"&gt;Object&lt;/span&gt;. Не поддавайтесь искушению вставить аргумент того же типа, что и класс. Иначе вы перегрузите (&lt;em&gt;overload&lt;/em&gt;) метод, а не переопределите (&lt;em&gt;override&lt;/em&gt;) его. В итоге функциональность других частей кода, зависящих от &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; будет неправильна. Например, итерации по &lt;span style="font-family:courier new;"&gt;HashMap&lt;/span&gt;, то есть &lt;span style="font-family:courier new;"&gt;containsKey()&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;get(),&lt;/span&gt; будут неправильны.&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; должен быть коммутативным оператором. То есть результат &lt;span style="font-family:courier new;"&gt;x.equals(y)&lt;/span&gt; должен быть равен результату &lt;span style="font-family:courier new;"&gt;y.equals(x)&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Если вы лпределяете &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt; в своём классе, то вы должны определить и &lt;span style="font-family:courier new;"&gt;hashCode()&lt;/span&gt;, который возвращает одно и то же значение для объектов, сравниваемых методом &lt;span style="font-family:courier new;"&gt;equals()&lt;/span&gt;. Это, опять таки, нужно для правильного функционирования итераций по контейнерам. Минимально допустимое поведение &lt;span style="font-family:courier new;"&gt;hashCode()&lt;/span&gt; - это &lt;span style="font-family:courier new;"&gt;return 1&lt;/span&gt;. Конечно, при такой имплементации потеряются все преимущества "настоящего" хеширования и &lt;span style="font-family:courier new;"&gt;HashMap&lt;/span&gt; будет просто связным списком. Но, по крайней мере, функциональность будет корректной.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-8681854374497211202?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/8681854374497211202/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=8681854374497211202' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/8681854374497211202'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/8681854374497211202'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/05/25-8.html' title='2.5 Операторы сравнения (Выпуск 8)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-2252952421160760779</id><published>2008-05-15T03:39:00.000-07:00</published><updated>2008-05-16T01:57:10.087-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='сдвиг'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>2.4. Операторы сдвига &lt;&lt;, &gt;&gt; и &gt;&gt;&gt;(Выпуск 7)</title><content type='html'>&lt;p&gt;В Java есть операторы сдвига. Операторы &amp;lt;&amp;lt; и &amp;gt;&amp;gt; позаимствованы из С/C++. Кроме того, Java обладает своим новым оператором сдвига &amp;gt;&amp;gt;&amp;gt;.&lt;/p&gt;&lt;p&gt;Операторы сдвига присущи системам, которые могут выравнивать биты, прочтённые из IO портов или зартсываемые в IO порты. Это также быстрое умножение или деление на степень двойки. Преимущество операторов сдвига в Java - это независимость от платформы. Поэтому вы можете использовать их не беспокоясь ни о чём.&lt;/p&gt;&lt;h3&gt;Основы сдвига&lt;/h3&gt;&lt;p&gt;Сдвиг - это, по сути, простейшая операция: мы берём последовательность битов и двигаем её влево или вправо. Больше всего конфуза вызывает оператор &amp;gt;&amp;gt;&amp;gt;. Но о нём мы поговорим чуть позже.&lt;/p&gt;&lt;p&gt;Операторы сдвига могут применяться лишь к целым числам, то есть к типам &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt; или &lt;span style="font-family:courier new;"&gt;long&lt;/span&gt;. Следующая таблица иллюстрирует базовый механизм сдвига.&lt;/p&gt;&lt;center&gt;Таблица 1: Идея сдвига&lt;br /&gt;&lt;table style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BORDER-COLLAPSE: collapse" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Исходные данные&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" colspan="6"&gt;&lt;p align="center"&gt;192&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Бинарное представление&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг влево на 1 бит &lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;p align="right"&gt;0&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000001&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;1000000?&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг вправо на бит&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;?0000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;01100000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг влево на 4 бита&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;0000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00001100&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;0000????&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Исходные данные&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" colspan="6"&gt;&lt;p align="center"&gt;-192&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Бинарное представление&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;01000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг влево на 1 бит &lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;p align="right"&gt;1&lt;/p&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111110&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;1000000?&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг вправо на бит&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;?1111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;10100000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;br /&gt;&lt;p&gt;Таблица показывает фундаментальную идею сдвига: перемещение битов относительно их позиций. Это как очередь в магазине: как только один человек совершил покупку и отшёл, вся очередь сдвинулась и позиции всех участников очереди изменились.&lt;/p&gt;&lt;p&gt;Однако, глядя на таблицу, возникают три вопроса вопроса:&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;ol&gt;&lt;li&gt;Что происходит, если мы сдвигаем влево и при этом часть бинарной записи выходит за границу слева, а часть - остаётся пустой справа?&lt;/li&gt;&lt;li&gt;Что происходит, когда справа - выход за границы, а слева - пустое место?&lt;/li&gt;&lt;li&gt;Какое истинное значение принимает знак "?"?.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Ответим на часть этих вопросов. Биты, вышедшие за границы, просто теряются. Мы о них забываем.&lt;/p&gt;&lt;p style="BORDER-RIGHT: red 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: red 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 10px; BORDER-LEFT: red 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: red 1px dotted"&gt;В некоторых языках, типа ассемблер, есть операция &lt;em&gt;ротации&lt;/em&gt;, когда при сдвиге вышедшие за границы биты не теряются, но ставятся на освободившееся место (вместо вопросиков). Однако языки высокого уровня, типа Java, не имеют в своём арсенале такой операции.&lt;/p&gt;&lt;h3&gt;Сдвиг отрицательных чисел&lt;/h3&gt;&lt;p&gt;Ответ на вопрос о значении символов "?" в приведенной выше таблице требует отдельного рассмотрения.&lt;/p&gt;&lt;p&gt;В случае сдвига влево &amp;lt;&amp;lt; и &lt;em&gt;беззнакового&lt;/em&gt; сдвига вправо &amp;gt;&amp;gt;&amp;gt; новые биты просто устанавливаются в ноль. В случае сдвига вправо &lt;em&gt;со знаком&lt;/em&gt; &amp;gt;&amp;gt; новые биты принимают значение старшего (самого левого) бита перед сдвигом. Следующая таблица демонстрирует это:&lt;/p&gt;&lt;center&gt;Таблица 2: Сдвиг положительных и отрицательных чисел&lt;br /&gt;&lt;table style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BORDER-COLLAPSE: collapse" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Исходные данные&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" colspan="4"&gt;&lt;p align="center"&gt;192&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Бинарное представление&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11000000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг вправо на 1 бит &lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;01100000&lt;/td&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг вправо на 7 бит&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000000&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00000001&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Исходные данные&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" colspan="4"&gt;&lt;p align="center"&gt;-192&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Бинарное представление&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;01000000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг вправо на 1 бит &lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;10100000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг вправо на 7 бит&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111110&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;p&gt;Заметьте: в том, случае, где старший бит был 0 перед сдвигом, новые биты стали тоже 0. Там где старший бит перед сдвигом был 1, новые биты тоже заполнились 1.&lt;/p&gt;&lt;p&gt;Это правило может показаться странным на первый взгляд. Но оно имеет под собой очень серьёзное обоснование. Если мы &lt;em&gt;сдвигаем&lt;/em&gt; бинарное число &lt;em&gt;влево&lt;/em&gt; на одну позицию, то в десятичной записи мы &lt;em&gt;умножаем&lt;/em&gt; его на два. Если мы сдвигаем влево на &lt;em&gt;n&lt;/em&gt; позиций, то умножение происходит на 2&lt;sup&gt;&lt;em&gt;n&lt;/em&gt;&lt;/sup&gt;, то есть на 2, 4, 8, 16 и т.д.&lt;/p&gt;&lt;p&gt;Сдвиг вправо даёт деление на степени двойки. При этом, добавление слева нулей на появившиеся биты на самом деле даёт деление на степени двойки лишь в случае положительных чисел. Но для отрицательных чисел всё совсем по другому!&lt;/p&gt;&lt;p&gt;Как известно, старший бит отрицательных чисел равен единице, 1. Для того, чтобы сохранить старшинство единицы при сдвиге, то есть сохранить отрицательный знак результата деления отрицательного числа на положительное (степень двойки), нам нужно подставлять единицы на освободившиеся места.&lt;/p&gt;&lt;p&gt;Если мы посмотрим на Таблицу 2, то заметим, что 192, сдвинутое на 1 бит вправо - это 192/2=96, а сдвинутое на 7 битов вправо - это 192/2&lt;sup&gt;7&lt;/sup&gt;=192/128=1 по законам целочисленной арифметики. С другой стороны, -192 сдвинутое на 1 бит вправо - это 192/2=-96 и т.д.&lt;/p&gt;&lt;div style="BORDER-RIGHT: red 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: red 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 10px; BORDER-LEFT: red 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: red 1px dotted"&gt;Есть, однако пример, когда реультат сдвига вправо отличается от результата целочисленного деления на 2. Это случай, когда аргумент = -1. При целочисленном делении мы имеем: -1/2=0. Но результат сдвига вправо нам даёт -1. Это можно трактовать так: целочисленное деление округляет к нулю, а сдвиг округляет к -1.&lt;/div&gt;&lt;p&gt;Таким образом, сдвиг вправо имеет две ипостаси: одна (&amp;gt;&amp;gt;&amp;gt;) просто сдвигает битовый паттерн "в лоб", а другая (&amp;gt;&amp;gt;) сохраняет эквивалентность с операцией деления на 2.&lt;/p&gt;&lt;div style="BORDER-RIGHT: red 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: red 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 10px; BORDER-LEFT: red 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: red 1px dotted"&gt;Зачем же Java потребовался беззнаковый сдвиг вправо (сдвиг "в лоб"), когда ни в С, ни в С++ его не существует? Ответ прост, потому что в &lt;em&gt;С и С++ сдвиг всегда беззнаковый&lt;/em&gt;. То есть &amp;gt;&amp;gt;&amp;gt;&amp;gt; в Java - это и есть сдвиг вправо в C и C++. Но, поскольку &lt;em&gt;в Java все численные типы со знаком&lt;/em&gt; (за исключением &lt;span style="font-family:courier new;"&gt;char&lt;/span&gt;), то и результаты сдвигов должны иметь знаки.&lt;/div&gt;&lt;h3&gt;Сокращение (reduction) правого операнда&lt;/h3&gt;&lt;p&gt;На самом деле у операторов сдвига есть правый операнд - число позиций, на которое нужно произвести сдвиг. Для корректного сдвига это число должно быть меньше, чем количество битов в результате сдвига. Если число типа &lt;span style="font-family:courier new;"&gt;int (long)&lt;/span&gt;, то сдвиг не может быть сделан более, чем на 32 (64) бита.&lt;/p&gt;&lt;p&gt;Оператор же сдвига не делает никаких проверок данного условия и допускает операнды, его нарушающие. При этом правый операнд сокращается по модулю от нужного количества битов. Например, если вы захотите сдвинуть целое число на 33 бита, то сдвиг произойдёт на 33%32=1 бит. В результатае такого сдвига мы легко можем получить аномальные результаты, то есть результаты, которых мы не ожидали. Например, при сдвиге на 33 бита мы ожидаем получить 0 или -1 (в знаковой арифметике). Но это не так.&lt;/p&gt;&lt;div style="BORDER-RIGHT: gray 1px dotted; PADDING-RIGHT: 10px; BORDER-TOP: gray 1px dotted; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 10px; BORDER-LEFT: gray 1px dotted; PADDING-TOP: 10px; BORDER-BOTTOM: gray 1px dotted"&gt;&lt;h3&gt;Почему Java сокращает правый операнд оператора сдвига или грустная история о заснувшем процессоре&lt;/h3&gt;&lt;p&gt;Одной из главной причин введения сокращения было то, что процессоры сами сокращают подобным образом правый операнд оператора сдвига. Почему?&lt;/p&gt;&lt;p&gt;Несколько лет назад был создан мощнейший процессор с длинными регистрами и операциями ротации и сдвигам на любое количество битов. Именно потому, что регистры были длинными, корректное выполнение этих операций требовало несколько минут.&lt;/p&gt;&lt;p&gt;Основным применением данных процессоров был контроль систем реального времени. В данных системах самый быстрый ответ на внешнее событие должно занимать не более задержки на прерывание (&lt;em&gt;interrupt latency&lt;/em&gt;). Отдельные инскрукции таких процессоров были неделимы. Поэтому выполнение длинных операций (сдвига на несколько бит и ротации) нарушало эффективную работу процессора.&lt;/p&gt;&lt;p&gt;Следующая версия процессора имплементировала эти операции уже по-другому: размер правого операнда сократился. Задержка на прерывание восстанавилась. И многие процессоры переняли данную практику.&lt;/p&gt;&lt;/div&gt;&lt;h3&gt;Арифметическое распространение (&lt;em&gt;promotion&lt;/em&gt;) операндов&lt;/h3&gt;&lt;p&gt;Апифметическое распространение операндов происходит перед применением оперции сдвига и гарантирует, что операнды по крайней мере типа &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt;. Это явление имеет особый эффект на беззнаковый сдвиг вправо, когда сдвигаемое число меньше, чем &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt;: мы получаем не тот результат, который ожидали.&lt;/p&gt;&lt;p&gt;Следующая таблица показывает пример аномалии:&lt;/p&gt;&lt;center&gt;Таблица 3: Арифметическое распространение для беззнакового сдвига вправо, когда операнд меньше, чем &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt;&lt;br /&gt;&lt;table style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid; BORDER-COLLAPSE: collapse" border="1"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Исходные данные (-64 в десятичной записи)&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid" colspan="4"&gt;&lt;p align="center"&gt;11000000&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Распространение до &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11000000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сдвиг вправо на 4 битa &lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00001111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111111&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111100&lt;/td&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Сокращение до байта&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;11111100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;Ожидаемый результат был&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;&lt;/td&gt;&lt;td style="BORDER-RIGHT: black 1px solid; BORDER-TOP: black 1px solid; BORDER-LEFT: black 1px solid; BORDER-BOTTOM: black 1px solid"&gt;00001100&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/center&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-2252952421160760779?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/2252952421160760779/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=2252952421160760779' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/2252952421160760779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/2252952421160760779'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/05/24-7.html' title='2.4. Операторы сдвига &amp;lt;&amp;lt;, &amp;gt;&amp;gt; и &amp;gt;&amp;gt;&amp;gt;(Выпуск 7)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-937130494627749207</id><published>2008-05-03T04:19:00.000-07:00</published><updated>2008-05-03T10:44:49.057-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='вычитание'/><category scheme='http://www.blogger.com/atom/ns#' term='NaN'/><category scheme='http://www.blogger.com/atom/ns#' term='сложение'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><category scheme='http://www.blogger.com/atom/ns#' term='toString'/><category scheme='http://www.blogger.com/atom/ns#' term='конкатенация'/><title type='text'>Сложение и вычитание, NaN (Выпуск 6)</title><content type='html'>&lt;h3&gt;Сложение и вычитание (+ и -)&lt;/h3&gt;&lt;p&gt;За сложение и вычитание отвечают соответсвенно операторы + и -. Они применимы для операндов любых численных типов. Помимо этого, операция + применяется и для операндов типа &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt;. Когда один из операндов типа &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt;, то результат будет объектом типа &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt;.&lt;/p&gt;&lt;h4&gt;Особенности оператора +&lt;/h4&gt;&lt;p&gt;В Java не допускается определять перегрузку операторов (то есть перепрограммирование операторов в зависимости от типа), как в С/С++. Но сам язык Java перегружает операторы автоматически. И это в общем-то не ново, поскольку многие языки программирования, которые поддерживают множественные арифметические типы, определяют автоматическую перегрузку арифметических операторов для примитивных типов. Java, помимо этого, имеет перегрузку оператора + для строкового типа (&lt;span style="font-family:courier new;"&gt;String&lt;/span&gt;). И результат действия оператора + в данном случае - это &lt;strong&gt;конкатенация&lt;/strong&gt;, сцепление строк. Если один из операндов не строковый, то к нему будет предварительно применено приведение типа к строке.&lt;/p&gt;&lt;div style="BORDER-RIGHT: 1px solid; BORDER-TOP: 1px solid; PADDING-LEFT: 10px; MARGIN-LEFT: 10px; BORDER-LEFT: 1px solid; BORDER-BOTTOM: 1px solid; margine-right: 10px; padding-right-10px: "&gt;&lt;p&gt;&lt;strong&gt;Перегрузка (overloading)&lt;/strong&gt; - это термин, упоминаемый в том случае, когда одна и та же операция (оператор) используется для операндов (аргументов) различного типа. При этом поведение операции (оператора) определяется типом операндов, к котором она должна быть применена. Например, метод &lt;span style="font-family:courier new;"&gt;println()&lt;/span&gt; может применяться как для операндов строкового, так и целочисленного типа. Эти два использования, на самом деле, относятся к совершенно различным методам. Просто было использовано одно и то же имя операции. Аналогично сложение (+) используется, как для целочисленных, так и для дробных типов. Но код, реализующий это сложение совершенно различный.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Вы все знаем, что произойдёт при сложении двух знацений численного типа: операнды будут суммированы. Конечно, может случится и &lt;em&gt;переполнение&lt;/em&gt;, если мы суммироем слишком большие числа. Но в общем и целом, поведение арифметических операторов не изобилует сюрпризами.&lt;/p&gt;&lt;p&gt;Если переполнение происходит при арифметическом сложении или вычитании, никаких сообщений об ошибках или исключений мы не получаем. Дело обстоит совсем по-другому, если мы конкатенируем строки. Если оба оператора строки, то результат - это "скленная" строка. Если один из операторов строка, а второй - число, то число будет приведено к типу &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt;.&lt;/p&gt;&lt;span class="fullpost"&gt;&lt;h4&gt;Приведение численных типов к строке&lt;/h4&gt;&lt;p&gt;Для объектных типов приобразование к типу &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt; происходит посредством вызова метода &lt;span style="font-family:courier new;"&gt;toString()&lt;/span&gt;. Этот метод определён в классе &lt;span style="font-family:courier new;"&gt;java.lang.Object&lt;/span&gt;, который является прародителем всех остальных классов. Поэтому все объекты наследуют от &lt;span style="font-family:courier new;"&gt;Object&lt;/span&gt; метод &lt;span style="font-family:courier new;"&gt;toString()&lt;/span&gt;. Однако, этот метод выдаёт некое зашифрованное значение объекта. Например, если мы рассмотрим такой код:&lt;/p&gt;&lt;pre&gt;1. public class Test {&lt;br /&gt;2.    private static class MyClass {&lt;br /&gt;3.        private String name;&lt;br /&gt;4.        private int age;&lt;br /&gt;5.        public MyClass() {&lt;br /&gt;6.            name = "Natalia Macheda";&lt;br /&gt;7.            age = 28;&lt;br /&gt;8.        }&lt;br /&gt;9.&lt;br /&gt;10.    }&lt;br /&gt;11.    public static void main (String[] args) {&lt;br /&gt;12.        MyClass myObj = new MyClass();&lt;br /&gt;13.        System.out.println(myObj.toString());&lt;br /&gt;14.    }&lt;br /&gt;15.}&lt;/pre&gt;&lt;p&gt;То результат, выводимый 13-й строкой будет такого вида: &lt;span style="font-family:courier new;"&gt;Test$MyClass@c17164&lt;/span&gt;. Здесь мы видим имена классов объекта (разделённые символом $) и какой-то идентификатор после символа @. Идентификатор - это, как правило, ссылка на объект.&lt;/p&gt;&lt;p&gt;Это не очень удобно для понимания, но может быть использовано, например, для отладки программы. С другой строны, для предания читаемости результату операции &lt;span style="font-family:courier new;"&gt;toString()&lt;/span&gt; необходимо перегрузить эту операцию. Например, если в 9-й строке вставить код:&lt;/p&gt;&lt;pre&gt;9.       public String toString(){&lt;br /&gt;9'. return (name + " " + age);&lt;br /&gt;9''. }&lt;/pre&gt;&lt;p&gt;то результат будет &lt;span style="font-family:courier new;"&gt;Natalia Macheda 28&lt;/span&gt;. Заметьте, что втрой аргумент - целочисленного типа. Как же произошло его преобразование в строку?&lt;/p&gt;&lt;p&gt;Преобразование чесленных аргументов к строчному типу &lt;em&gt;неявно&lt;/em&gt; использует метод &lt;span style="font-family:courier new;"&gt;toString()&lt;/span&gt; &lt;strong&gt;классов-оболочек (wrapper)&lt;/strong&gt;. Например, значение типа &lt;span style="font-family:courier new;"&gt;int&lt;/span&gt; конвертируется вызовом &lt;em&gt;статической&lt;/em&gt; функции &lt;span style="font-family:courier new;"&gt;Integer.toString()&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Резюмируем сведения о сложении. Сложение двух числовых значений примтивных типов даёт результат:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;примитивного численного типа;&lt;/li&gt;&lt;li&gt;по крайней мере самого длинного типа среди типов операндов, участвующих в сложении;&lt;/li&gt;&lt;li&gt;вычисленный приведением обоих операндов к типу результата и их дальнейшим суммированием.&lt;/li&gt;&lt;li&gt;Результат может переполнить тип и точность вычисления может потеряться.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Если один из операндов - НЕпримитивного типа:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;второй операнд должен быть строкового типа. Иначе операция нелегальна;&lt;/li&gt;&lt;li&gt;операнд НЕстрокового типа приводится к типу &lt;span style="font-family:courier new;"&gt;String&lt;/span&gt; и результат - сцепление двух строк.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Приведение операнда объектного типа к строке производится путём вызова метода &lt;span style="font-family:courier new;"&gt;toString()&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Приведение операнда примитивного типа к строке производится &lt;em&gt;неявно&lt;/em&gt; путём вызова статичского метода класса-оболочки.&lt;/p&gt;&lt;div style="BORDER-RIGHT: 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: 1px solid; PADDING-LEFT: 10px; MARGIN-LEFT: 10px; BORDER-LEFT: 1px solid; MARGIN-RIGHT: 10px; BORDER-BOTTOM: 1px solid"&gt;&lt;p&gt;Если вы хотите держать под контролем форматирование результата приведения типа, обратитесь к коду пакета &lt;span style="font-family:courier new;"&gt;java.text&lt;/span&gt;.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Теперь, когда мы разобрались с арифметическими операциями, приведениями типов и конкатенацией строк при помощи оператора +, мы должны вспомнить, что имеем дело с компьютером, который ограничер в своих возможностях представления неких математических абстракций. А значит, всем известные арифметические операции могут работать неправильно и выдавать ошибки.&lt;/p&gt;&lt;h3&gt;Арифметические ошибки&lt;/h3&gt;&lt;p&gt;Мы ожидаем от арифметических операций результата, который выдаёт знаяение с математическим смыслом. Но, как уже было сказано выше, результат может не соответсвовать нашим ожиданиям в виду ограниченности ресурсов компьютера. В частности:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Деление на ноль (в том числе и для операции %) выдаёт &lt;span style="font-family:courier new;"&gt;ArithmeticException&lt;/span&gt;;&lt;/li&gt;&lt;li&gt;Никаких других исключений для арифметических операций не выдаётся, но результат может быть арифметически неправильным ввиду &lt;em&gt;переполнения&lt;/em&gt;.&lt;/li&gt;&lt;li&gt;Дробные типы представляют абстрактные значения при помощи следующих значений: IEEE 754 бесконечности, минус бесконечности и Не-числа &lt;span style="font-family:courier new;"&gt;NaN&lt;/span&gt; (Not a Number). Именные константы, представляющие эти значения, объявлены в классах &lt;span style="font-family:courier new;"&gt;Float&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;Double&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;NaN&lt;/span&gt; сигнализирует о том, что вычисление не имеет результата в математическом понимании. Например, бесконечность или вычисление квадратного корня из отрицательного числа.&lt;/p&gt;&lt;h3&gt;Сравнение с НЕ-числом&lt;/h3&gt;&lt;p&gt;Два НЕ-числа &lt;span style="font-family:courier new;"&gt;NaN&lt;/span&gt; определены в пакете java.lang. Это &lt;span style="font-family:courier new;"&gt;Float.NaN&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;Double.NaN&lt;/span&gt;. Следующие сравнения всегда дают &lt;span style="font-family:courier new;"&gt;false&lt;/span&gt;, даже если &lt;span style="font-family:courier new;"&gt;x&lt;/span&gt; равен &lt;span style="font-family:courier new;"&gt;NaN&lt;/span&gt;:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;"&gt;x &lt; Float.NaN&lt;br /&gt;x &lt;= Float.NaN&lt;br /&gt;x == Float.NaN&lt;br /&gt;x &gt; Float.NaN&lt;br /&gt;x &gt;= Float.NaN&lt;/span&gt;&lt;/p&gt;&lt;p&gt;В тестах &lt;span style="font-family:courier new;"&gt;Float.NaN != Float.NaN&lt;/span&gt; и &lt;span style="font-family:courier new;"&gt;Doube.NaN != Double.NaN&lt;/span&gt; результат будет &lt;span style="font-family:courier new;"&gt;true&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Если же вы хотите проверить, что число (не) является &lt;span style="font-family:courier new;"&gt;NaN&lt;/span&gt;, то нужно использовать статические методы &lt;span style="font-family:courier new;"&gt;Float.isNaN(float)&lt;/span&gt; или &lt;span style="font-family:courier new;"&gt;Double.isNaN(double)&lt;/span&gt;, определённые в пакете &lt;span style="font-family:courier new;"&gt;java.lang&lt;/span&gt;&lt;span &gt;.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-937130494627749207?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/937130494627749207/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=937130494627749207' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/937130494627749207'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/937130494627749207'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/05/nan-6.html' title='Сложение и вычитание, NaN (Выпуск 6)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-803947271934746132</id><published>2008-04-27T14:37:00.001-07:00</published><updated>2008-05-02T14:10:11.149-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='деление'/><category scheme='http://www.blogger.com/atom/ns#' term='арифметические операторы'/><category scheme='http://www.blogger.com/atom/ns#' term='умножение'/><category scheme='http://www.blogger.com/atom/ns#' term='деление по модулю'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>2.3 Арифметические операторы: умножение, деление, деление по модулю</title><content type='html'>&lt;h2&gt;2.3 Арифметические операторы&lt;/h2&gt;&lt;p&gt;По приоритетности за унарными операторами следуют арифметические операторы. Эта группа включает в себя четыре наиболее распространённых оператора: сложение, вычитание, умножение, деление. И не только их. Существует также оператор деления по модулю, который обозначается знаком %. Арифметические операторы разделены на две группы. В первой, более приоритетной, группе находятся *, /, %. Во второй, соответственно, + и -.&lt;/p&gt;&lt;h3&gt;Умножение и деление (* и /)&lt;/h3&gt;&lt;p&gt;Операторы * и / выполняют умножение и деление над всеми примитивными числовыми типами и &lt;span style="font-family:courier new,courier,monospace;"&gt;char.&lt;/span&gt;&lt;span style="font-family:tahoma,arial,helvetica,sans-serif;"&gt; &lt;/span&gt;&lt;span style="font-family:times new roman,times,serif;"&gt;При делении на ноль возникает &lt;/span&gt;&lt;span style="font-family:courier new,courier,monospace;"&gt;ArithmeticException&lt;/span&gt;&lt;span style="font-family:times new roman,times,serif;"&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Вы, наверное, недоумеваете, зачем я вам рассказываю про умножение и деление известное вам с первого класса. Однако, в программировании мы имеем дело с некоторыми ограничениями, связанными с представлением чисел в компьютере. Эти ограничения накладываются на все числовые форматы, от &lt;span style="font-family:courier new,courier,monospace;"&gt;byte&lt;/span&gt; до &lt;span style="font-family:courier new,courier,monospace;"&gt;double&lt;/span&gt;. Но наиболее заметны они для целочисленного типа &lt;span style="font-family:courier new,courier,monospace;"&gt;int&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Если вы умножаете или делите два числа, результат вычисляется посредством целочисленной арифметики и сохраняется либо в &lt;span style="font-family:courier new,courier,monospace;"&gt;int&lt;/span&gt;, либо в &lt;span style="font-family:courier new,courier,monospace;"&gt;long&lt;/span&gt;. Если числа очень большие, то результат будет больше максимального числа, которое можно представить в этих числах. А значит, результат не сможет правильно закодироваться компьютером и не будет иметь смысла. Например, тип &lt;span style="font-family:courier new,courier,monospace;"&gt;byte&lt;/span&gt; используется для представления чисел в диапазоне от -128 до 127. Если мы умножим 64 и 4, то результат 256, имеющий в двоичной записи 100000000 девять символов, будет закодирован, как 0, потому что &lt;span style="font-family:courier new,courier,monospace;"&gt;byte&lt;/span&gt; использует лишь 8 символов.&lt;/p&gt;&lt;p&gt;Рассмотрим деление. Если вы делите в целочисленной арифметике, результат должен быть обязательно целочисленным. И значит, дробная часть будет потеряна. Например, 7/4 даёт нам 1.75, но в целочисленной арифметике это будет 1.&lt;/p&gt;&lt;p&gt;Таким образом, если вы имеете дело со сложными выражениями, вы можете выбирать последовательность умножений и делений. Но имейте в виду, что умножение может привести к &lt;strong&gt;переполнению&lt;/strong&gt;, а деление - к &lt;strong&gt;потере точности&lt;/strong&gt;. Народная мудрость считает, что выполнение сначала умножений, а потом делений в большинстве случаев выдаёт правильный результат.&lt;span class="fullpost"&gt; Рассмотрим пример:&lt;/p&gt;&lt;pre&gt;1. int a = 12345, b = 234567, c, d;&lt;br /&gt;2. long e, f;&lt;br /&gt;3.&lt;br /&gt;4. c = a * b / b; // должно равняться а=12345&lt;br /&gt;5. d = a / b * b; // тоже должно равняться а=12345&lt;br /&gt;6. System.out.println(“a is “ + a +&lt;br /&gt;7. “\nb is “ + b +&lt;br /&gt;8. “\nc is “ + c +&lt;br /&gt;9. “\nd is “ + d);&lt;br /&gt;10.&lt;br /&gt;11. e = (long)a * b / b;&lt;br /&gt;12. f = (long)a / b * b;&lt;br /&gt;13. System.out.println(&lt;br /&gt;14. “\ne is “ + e +&lt;br /&gt;15. “\nf is “ + f);&lt;/pre&gt;&lt;p&gt;Результат работы данного фрагмента выдаст следующее:&lt;/p&gt;&lt;pre&gt;a is 12345&lt;br /&gt;b is 234567&lt;br /&gt;c is -5965&lt;br /&gt;d is 0&lt;br /&gt;e is 12345&lt;br /&gt;f is 0&lt;/pre&gt;&lt;p&gt;Пусть вас не смущают числовые значения данного примера. Важно то, что при выполнении умножения первым мы получили переполнение (&lt;span style="font-family:courier new,courier,monospace;"&gt;c is -5965&lt;/span&gt;), когда закодировали его в тип &lt;span style="font-family:courier new,courier,monospace;"&gt;int&lt;/span&gt;. Однако мы можем получить правильный результат, если закондируем его в более длинный тип, как, например, &lt;span style="font-family:courier new,courier,monospace;"&gt;long&lt;/span&gt;. В обоих случаях применение первым деления будет катастрофическим для результата, независимо от длины его типа.&lt;/p&gt;&lt;h3&gt;Деление по модулю %&lt;/h3&gt;&lt;p&gt;Результат деления по модулю - остаток от деления. Например, 7/4 равно 1 с остатком 3. Поэтому 7%4 = 3. Обычно операнды имеют целочисленный тип, но иногда оператор применяется и к числам с плавающей точкой. Также следует знать некоторые особенности данного оператора, когда операнды отрицательные. &lt;/p&gt;&lt;p&gt;При негативных или дробных операндах правило такое: &lt;em&gt;вычитайте правый операнд из левого до тех пор, пока последний не станет меньше первого. &lt;/em&gt;Примеры:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;17%5 = ?&lt;/strong&gt; 17-5=12&amp;gt;5; 12-5=7&amp;gt;5; 7-5=2&amp;lt;5. Значит &lt;strong&gt;17%5 = 2&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;21%7?&lt;/strong&gt; 21-7=14&amp;gt;7; 14-7=7=7; 7-7=0&amp;lt;7. Значит &lt;strong&gt;21%7 = 0&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7.6%2.9?&lt;/strong&gt; 7.6-2.9=4.7&amp;gt;2.9; 4.7-2.9=1.8&amp;lt;2.9. Значит &lt;strong&gt;7.6%2.9=1.8&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Заметьте: знак результата (положительный или отрицательный) целиком и полностью определён знаком левого операнда, то есть делимого.&lt;/p&gt;&lt;p&gt;Когда деление по модулю производится над дробными числами, то суть этой операции состоит в том, чтобы вычесть делитель несколько раз. Результат может быть также дробным числом.&lt;/p&gt;&lt;p&gt;Простое правило для отрицательных операндов такое: отбросьте знак минуса от операндов, произведите деление по модулю с положительными операндами, а затем поставьте перед результатом минус, если левый операнд (делимое) был отрицательным.&lt;/p&gt;&lt;p&gt;Деление по модулю, как и нормальное деление, может выбросить исключение &lt;span style="font-family:courier new;"&gt;ArithmeticException&lt;/span&gt;, если делитель (правый операнд) ровняется нулю.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-803947271934746132?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/803947271934746132/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=803947271934746132' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/803947271934746132'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/803947271934746132'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/23.html' title='2.3 Арифметические операторы: умножение, деление, деление по модулю'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-5843602752393616277</id><published>2008-04-27T12:56:00.000-07:00</published><updated>2008-04-27T13:03:36.294-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='глава 2'/><category scheme='http://www.blogger.com/atom/ns#' term='присваивание'/><category scheme='http://www.blogger.com/atom/ns#' term='операторы'/><title type='text'>2. Операторы и присваивания (Выпуск 4)</title><content type='html'>&lt;h2&gt;2. Операторы и присвоения" (&lt;em&gt;Operators and assignments&lt;/em&gt;)&lt;/h2&gt;&lt;p&gt;Операторы в Java используются для разнообразных операций (всех необходимых). Все Javaоператоры перечислены в Таблице 2.1:&lt;/p&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="BORDER-BOTTOM: black 2pt solid" colspan="2"&gt;&lt;br /&gt;&lt;p&gt;Таблица 2.1: Операторы Java в нисходящем порядке приоритетности массива&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: Arial; TEXT-ALIGN: left"&gt;&lt;th&gt;Категория&lt;/th&gt;&lt;th&gt;Операторы&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-SIZE: 1pt; BORDER-BOTTOM: black 1pt solid" colspan="2"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Унарные&lt;/td&gt;&lt;td&gt;++ -- + - ! ~ ()&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Арифметические&lt;/td&gt;&lt;td&gt;* / %&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;+ -&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Сдвиг&lt;/td&gt;&lt;td&gt;&amp;lt;&amp;lt; &amp;gt;&amp;gt; &amp;gt;&amp;gt;&amp;gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Сравнение&lt;/td&gt;&lt;td&gt;&amp;lt; &amp;lt;= &amp;gt; &amp;gt;= instanceof&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;== !=&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Поразрядные&lt;/td&gt;&lt;td&gt;&amp;amp; ^ &lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Быстрого принятия решения&lt;/td&gt;&lt;td&gt;&amp;amp;&amp;amp; &lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Условные&lt;/td&gt;&lt;td&gt;?:&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;Присвоение&lt;/td&gt;&lt;td&gt;= op=&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-TOP: black 2pt solid" colspan="2"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;span class="fullpost"&gt;&lt;h3&gt;2.1. Порядок вычисления&lt;/h3&gt;&lt;p&gt;В Java, в отличие от многих других языков, явный порядок вычисления зафиксирован. Результат любого выражения считается слева направо. Рассмотрим фрагмент кода:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. int [] a = { 4, 4 };&lt;br /&gt;2. int b = 1;&lt;br /&gt;3. a[b] = b = 0;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;Какой элемент массива модифицирован? Какое значение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;b&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; использовано для выбора элемента массива: 0 или 1? Согласно правилу вычисления слева направо самое левое выражение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;a[b]&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; должно быть вычислено первым. Так что это &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;a[1]&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Затем вычисляется &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;b&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, то есть активируется ссылка на переменную &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;b&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Затем вычисляется константа 0, что не требует никаких операций. Затем в вычисление включаются операторы. Вычисление при этом проводится в порядке приоритетности и ассоциацивности. Для присвоений ассоциативность - справа налево. Таким образом, сначала значение 0 присваивается переменной &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;b&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, которая, в свою очередь, затем присваивается последнему элементу массива &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;a&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;&lt;span class="lyric"&gt;Рекомендуется использовать простые выражения и скобки, чтобы улучшить читаемость кода. Код, сгенерированый компилятром, будет тем же самым, несмотря на скобки.&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;h3&gt;2.2. Унарные операторы&lt;/h3&gt;&lt;p&gt;Большинство оперторов имеют два операнда. Например, когда мы производим умножение, то делаем это с двумя числами. Однако, унарные операторы применяются только к одному операнду. В Java представлены семь унарных операторов: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;Инкремент (увеличение значения на 1) и декремент (уменьшение значения на 1): ++ и -- &lt;/li&gt;&lt;li&gt;Унарный плюс и минус: + и - &lt;/li&gt;&lt;li&gt;Поразрядное инвертирование: ~ &lt;/li&gt;&lt;li&gt;Логическое дополнение: ! &lt;/li&gt;&lt;li&gt;Приведение типа: ( ) &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;&lt;span class="lyric"&gt;Строго говоря, приведение типа - это не оператор. Но мы его обсуждаем именно в таком ключе, потому что к нему применяются все тезисы нашего дальнейшего обсуждения.&lt;/span&gt;&lt;/p&gt;&lt;h4&gt;Инкремент (увеличение значения на 1) и декремент (уменьшение значения на 1): ++ и --&lt;/h4&gt;&lt;p&gt;Эти операторы изменяют значение выражения добавлением или вычитанием 1. Например, если переменная &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; равна 10, то &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;++x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; (&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;--x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;) равно 11 (соответственно, 9). Результат записывается в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;В предыдущих примерах операторы находились перед переменной. Они могут находиться и после неё. И &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;++x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, и &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x++&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; дают один и тот же результат, сохраняемый в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Но значение всего выражения отличается. Например, если &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;y = x++&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, то значение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;y&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; равно исходному значению &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Если же &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;y = ++x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, то значение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;y&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; на единицу больше, чем исходное значение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. В обоих случаях значение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; увеличивается на 1.&lt;/p&gt;&lt;p&gt;Если инкремент (декремент) расположен слева от выражения, то выражение модифицируется &lt;em&gt;перед&lt;/em&gt; тем (&lt;em&gt;после&lt;/em&gt; того), как оно начинает участвовать в остальном вычислении. Это называется &lt;em&gt;пре-инкремент&lt;/em&gt; (&lt;em&gt;пре-декремент&lt;/em&gt;). Соответсвенно, если оператор находится справа от выражения, то в остальном вычислении участвует &lt;em&gt;исходное&lt;/em&gt; значение этого выражения. И инкремент (декремент) происходит после того, как вычисление всего выражения завершено.&lt;/p&gt;&lt;p&gt;Таблица 2.2. показывает значения &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;y&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; после применения инкремента и декремента справа и слева.&lt;br /&gt;&lt;br /&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="BORDER-BOTTOM: black 2pt solid" colspan="4"&gt;&lt;br /&gt;&lt;p&gt;Таблица 2.2: Примеры премодификации и постмодификации инкрементом и декрементом&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: Arial; TEXT-ALIGN: left"&gt;&lt;th&gt;Категория&lt;/th&gt;&lt;th&gt;Операторы&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-SIZE: 1pt; BORDER-BOTTOM: black 1pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold;font-family:Tahoma;font-size:10pt;"  &gt;&lt;td&gt;Начальное значение &lt;span class="src"&gt;&lt;span style="font-family:Courier;font-size:180%;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Выражение&lt;/td&gt;&lt;td&gt;Итоговое значение &lt;span class="src"&gt;&lt;span style="font-family:Courier;font-size:180%;"&gt;y&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;Итоговое значение &lt;span class="src"&gt;&lt;span style="font-family:Courier;font-size:180%;"&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;font-size:180%;"&gt;y = x++&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;font-size:180%;"&gt;y = ++x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;6&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;font-size:180%;"&gt;y = x--&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-SIZE: 12pt; FONT-FAMILY: Tahoma"&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;font-size:180%;"&gt;y = --x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;4&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-TOP: black 2pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;h4&gt;Унарный плюс и минус: + и -&lt;/h4&gt;&lt;p&gt;Унарные операторы + и - отличаются от обычных бинарных операторов + и -, которые трактуются, как сложение и вычитание. Унарный + не имеет никакого эфекта, кроме подчёркивания положительной природы численного литерала. Унарный - отрицает выражение (было положительным - стало отрицательным, было отрицательным - стало положительным). Примеры:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. x = -3;&lt;br /&gt;2. y = +3;&lt;br /&gt;3. z = -(y + 6);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;В примере единственное обоснование использования унарного плюса - подчёркивание, что переменной &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;y&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; присваивается положительное число. Общее выравнивание кода также более красиво с эстетической точки зрения :). Заметим, что в третьей строке унарный оператор применяется не к литералу, а к выражению. Таким образом, значение переменной &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;z&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; присваивается -9. &lt;/p&gt;&lt;h4&gt;Поразрядное инвертирование: ~&lt;/h4&gt;&lt;p&gt;Каждый примитивный тип Java представляется в виртуальной машине так, что представление не зависит от платформы. Это означает, что битовый шаблон, используемый для представления некоего отдельного числа, будет всегда тем же самым. Таким образом и манипулирование битами - процесс более эффективный, в силу независимости от платформы. Поразрядное инвертирование означает, что в двоичном представлении числа 0 заменяется на 1, а 1 - на 0.&lt;/p&gt;&lt;p&gt;Например, применение этого оператора к байту с содержимым 00001111 даст 11110000.&lt;/p&gt;&lt;h4&gt;Логическое дополнение: !&lt;/h4&gt;&lt;p&gt;Оператор ! инвертирует логическое значение выражения. Например, &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;!true = false&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Этот оператор часто используется в тестовой части &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;if ()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; конструкции. Эффект этого - изменение значения логического выражения. То есть обработчики &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;if ()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;else&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; могут быть легко обменяться местами. Рассмотрим два эквивалентных фрагмента кода:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. public Object myMethod(Object x) {&lt;br /&gt;2. if (x instanceof String) {&lt;br /&gt;3. // do nothing&lt;br /&gt;4. }&lt;br /&gt;5. else {&lt;br /&gt;6. x = x.toString();&lt;br /&gt;7. }&lt;br /&gt;8. return x;&lt;br /&gt;9. }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;и&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. public Object myMethod(Object x) {&lt;br /&gt;2. if (!(x instanceof String)) {&lt;br /&gt;3. x = x.toString();&lt;br /&gt;4. }&lt;br /&gt;5. return x;&lt;br /&gt;6. }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;В первом фрагменте, тестирование происходит в строке 2, но присвоение - в строке 6, если тест не пройдёт. Это сделано немного громоздко при помощи ветви &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;else&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; конструкции &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;if/else&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Второй фрагмент использует оператор логического дополнения, поэтому во второй строке тест инвертирован и может быть прочтён как &lt;em&gt;Если &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; не строка&lt;/em&gt;. Если тест проходит, то обработка происходит в третьей строке и никакого отдельного &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;else&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; не требуется и результирующий код более краток и более читаем.&lt;/p&gt;&lt;h4&gt;Приведение типа: ( )&lt;/h4&gt;&lt;p&gt;Приведение типа используется для явной конвертации выражения в заданный тип. Операция возможна только для допустимых типов. И во время компиляции, и во время выполнения программы, приведение типа проверяется на корректность. И этот аспект будет описан в дальнейших выпусках рассылки.&lt;/p&gt;&lt;p&gt;Приведение типа применяется для изменения типа значений примитивного типа. Например, мы можем форсировать конвертацию &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; к &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; как, например, в следующем фрагменте:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;&lt;span class="src"&gt;int circum = (int)(Math.PI * diameter);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;Здесь приведение типа выражается фрагментом &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;(int)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Если бы этот фрагмент отсутсвовал, то компилятор бы выдал ошибку, поскольку &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; значение, возвращаемое арифметическим выражением не может быть точно представлено &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; значением, к которому присваивается. Присвоение типа - это способ, которым программист говорит компилятору: "Я знаю, что такое присвоение может быть рискованным, но верь мне, ведь я - специалист". Конечно, если результат при этом теряет точность так, что программа не функционирует должным образом, - это ответсвенность программиста.&lt;/p&gt;&lt;p&gt;Присвоение типа может быть применено и к объектным (непримитивным) типам. Это типично, например, для случаев, когда используются контейнеры типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Vector&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Если вы помещаете объект типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;String&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Vector&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, то когда вы его извлекаете, тип, возвращаемый методом &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;elementAt()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, будет &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Object&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Для использования извлечённого объекта как &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;String&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; нужно применить приведение типа, как, например, в следующем фрагменте кода:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. Vector v = new Vector();&lt;br /&gt;2. v.add ("Hello");&lt;br /&gt;3. String s = (String)v.get(0);&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;В данном примере приведение типа имеет место в третьей строке (конструкция &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;(String)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;). И хотя компилятор допускает такое приведение типа, во время выполнения программы всё равно проверяется, является объект извлечённый из &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Vector&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; на самом деле объектом типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;String&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. В будущих выпусках я расскажу о допустимых приведениях типов.&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-5843602752393616277?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/5843602752393616277/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=5843602752393616277' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/5843602752393616277'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/5843602752393616277'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/2-4.html' title='2. Операторы и присваивания (Выпуск 4)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-7226283327777690292</id><published>2008-04-27T12:53:00.000-07:00</published><updated>2008-04-27T12:55:59.852-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='основы языка'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 1'/><category scheme='http://www.blogger.com/atom/ns#' term='ответы на тест'/><title type='text'>Ответы на тест по основам языка (Выпуск 4)</title><content type='html'>&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;&lt;strong&gt;Ответ В&lt;/strong&gt;: разность между количеством отрицательных чисел и количеством положительных чисел равна единице (отрицательных чисел больше).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ A, В, C, D, E&lt;/strong&gt;: все идентификаторы допустимы.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ В, D&lt;/strong&gt;: все варианты являются допустимыми сигнатурами методов. Но для того, чтобы быть точкой входа в приложение, метод &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;main()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; должен быть &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public static void&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и принимать один параметр типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;String[]&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ D&lt;/strong&gt;: порядок &lt;em&gt;Декларация пакета, импорты, классы&lt;/em&gt; должен быть соблюдён строго.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ A, E&lt;/strong&gt;: массив из 25-ти элемнтов индексируется от 0 до 24. Все элементы инициализируются нулём.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ D&lt;/strong&gt;: объект типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Holder&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; создаётся в третьей строчке. Ссылка на этот объект передаётся в метод &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;bump()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; в пятой строчке. И внутри метода поле &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;held&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; объекта изменяет значение с 100 на 101.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ C&lt;/strong&gt;: в метод &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;decrement()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; передаётся копия аргумента &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;d&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;; копия увеличивает значение на единицу, но сам аргумент нет.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ A&lt;/strong&gt;: сборщик мусора не может быть вызван принудительно. На вызовы &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;System.gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Runtime.gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; нельзя полагаться на 100%, потому что сборка мусора может быть отсрочена в пользу потока более высокой приоритетности. Поэтому ответы &lt;strong&gt;B&lt;/strong&gt; и &lt;strong&gt;D&lt;/strong&gt; неверны. Ответ &lt;strong&gt;C&lt;/strong&gt; неверен хотя бы потому, что метод &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; не принимает никаких аргументов. Ответ &lt;strong&gt;E&lt;/strong&gt; просто напросто декларирует, что объект может быть собран сборщиком мусора, когда тот начнёт свою работу.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ D&lt;/strong&gt;: 16-тибитный тип &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;short&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; вартируется от -2&lt;sup&gt;15&lt;/sup&gt; до 2&lt;sup&gt;15&lt;/sup&gt;-1 согласно Java спецификации вне зависимости от платформы.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Ответ D&lt;/strong&gt;: 8-мибитный тип &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;byte&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; вартируется от -2&lt;sup&gt;7&lt;/sup&gt; до 2&lt;sup&gt;7&lt;/sup&gt;-1 согласно Java спецификации вне зависимости от платформы.&lt;/li&gt;&lt;/ol&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-7226283327777690292?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/7226283327777690292/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=7226283327777690292' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/7226283327777690292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/7226283327777690292'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/blog-post.html' title='Ответы на тест по основам языка (Выпуск 4)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-9111045816497831512</id><published>2008-04-27T12:46:00.000-07:00</published><updated>2008-04-27T12:49:24.676-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='основы языка'/><category scheme='http://www.blogger.com/atom/ns#' term='тест'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 1'/><title type='text'>Тест по основам языка (Выпуск 3)</title><content type='html'>&lt;h3&gt;1.10. Тест для самопроверки&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Данные типов со знаком имеют равное количество положительны ненулевых и отрицательных значений.&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Истинно &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Ложно &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Выберите все идентификаторы, которые допускаются в Java программе.&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;BigOlLongStringWithMeaninglessName&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;$int&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;bytes&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;$1&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;finallist&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Какие из нижеследующих сигнатур могут быть использованы для объявления метода&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;main()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;? (Выберите все допустимые.)&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public static void main()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public static void main(String arg[])&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public void main(String [] arg)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public static void main(String[] args)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public static int main(String [] arg)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Если исходый файл включает в себя все три высокоуровневых элемента, какова их последовательность?&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Импорты, декларация пакета, классы &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Классы, импорты, декларация пакета &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Декларация пакета идёт первой, а порядок импортов и классов не существенен &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Декларация пакета, импорты, классы &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Импорты идёт первыми, а порядок декларации пакета и определений классов несущественен &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Рассмотрим следующую строку кода: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;int[] x = new int[25];&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. После её выполения, какие утверждения истинны? (Выберите все истинные утверждения.)&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x[24] = 0&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x[24]&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; не определено &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x[25] = 0&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x[0] = null&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;x.length = 25&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Рассмотрим следующий код:&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1.  class Q6 {&lt;br /&gt;2.      public static void main(String args[]) {&lt;br /&gt;3.          Holder h = new Holder();&lt;br /&gt;4.          h.held = 100;&lt;br /&gt;5.          h.bump(h);&lt;br /&gt;6.          System.out.println(h.held);&lt;br /&gt;7.      }&lt;br /&gt;8.  }&lt;br /&gt;9.&lt;br /&gt;10. class Holder {&lt;br /&gt;11.     public int held;&lt;br /&gt;12.     public void bump(Holder theHolder) {&lt;br /&gt;13.         theHolder.held++;&lt;br /&gt;14.     }&lt;br /&gt;15. }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;Что печатается в строке 6?&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;0 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;1 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;100 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;101 &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Рассмотрим следующий код:&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1.  class Q7 {&lt;br /&gt;2.      public static void main(String args[]) {&lt;br /&gt;3.          double d = 12.3;&lt;br /&gt;4.          Decrementer dec = new Decrementer();&lt;br /&gt;5.          dec.decrement(d);&lt;br /&gt;6.          System.out.println(d);&lt;br /&gt;7.      }&lt;br /&gt;8.  }&lt;br /&gt;9.&lt;br /&gt;10. class Decrementer {&lt;br /&gt;11.     public void decrement(double decMe) {&lt;br /&gt;12.         decMe = decMe - 1.0;&lt;br /&gt;13.     }&lt;br /&gt;14. }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;Что печатается в строке 6?&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;0.0 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;-1.0 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;12.3 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;11.3 &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Как можно заставит сборщик мусора освободить память, выделенную под некий объект?&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Никак &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Вызвав &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;System.gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Вызвав &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;System.gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, и передав параметром ссылку на объект, память под который хотим освободить &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Вызвав &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Runtime.gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Установив ссылку на объект в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Каков диапазон значений, которые могут быть присвоены перемнной типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;short&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;?&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Зависит от аппаратного обеспечения компьютера, на котором запускаетя программа &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От 0 до 2&lt;sup&gt;16&lt;/sup&gt;-1 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От 0 до 2&lt;sup&gt;32&lt;/sup&gt;-1 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От -2&lt;sup&gt;15&lt;/sup&gt; до 2&lt;sup&gt;15&lt;/sup&gt;-1 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От -2&lt;sup&gt;31&lt;/sup&gt; до 2&lt;sup&gt;31&lt;/sup&gt;-1 &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;li&gt;Каков диапазон значений, которые могут быть присвоены перемнной типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;byte&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;?&lt;br /&gt;&lt;ol&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;Зависит от аппаратного обеспечения компьютера, на котором запускаетя программа &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От 0 до 2&lt;sup&gt;8&lt;/sup&gt;-1 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От 0 до 2&lt;sup&gt;16&lt;/sup&gt;-1 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От -2&lt;sup&gt;7&lt;/sup&gt; до 2&lt;sup&gt;7&lt;/sup&gt;-1 &lt;/li&gt;&lt;li style="LIST-STYLE-TYPE: upper-alpha"&gt;От -2&lt;sup&gt;15&lt;/sup&gt; до 2&lt;sup&gt;15&lt;/sup&gt;-1 &lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-9111045816497831512?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/9111045816497831512/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=9111045816497831512' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/9111045816497831512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/9111045816497831512'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/3_1477.html' title='Тест по основам языка (Выпуск 3)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-220807098457545737</id><published>2008-04-27T12:45:00.001-07:00</published><updated>2008-04-27T12:49:50.086-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='основы языка'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 1'/><category scheme='http://www.blogger.com/atom/ns#' term='резюме'/><title type='text'>Резюме по основам языка (Выпуск 3)</title><content type='html'>&lt;h3&gt;1.9. Итоги первой главы&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;Элементы исходного файла должны идти в следующем порядке: &lt;/li&gt;&lt;ol&gt;&lt;li&gt;Декларация пакетов &lt;/li&gt;&lt;li&gt;Утверждения импортов &lt;/li&gt;&lt;li&gt;Определения классов &lt;/li&gt;&lt;/ol&gt;&lt;li&gt;В исходном файле должно быть хотя бы одно общедоступное (&lt;em&gt;public&lt;/em&gt;) определение класса, имя которого должно совпадать с именем файла. &lt;/li&gt;&lt;li&gt;Идентификатор должен начинаться с буквы, символа доллара или подчёркивания; остальными символами могут быть буквы, цифры, символы доллара или подчёркивания. &lt;/li&gt;&lt;li&gt;В Java имеются четыре примитивных целочисленных типа со знаком: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;byte, short, int, long&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;Два примитивных типа с плавающей точкой: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;float, double&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;Тип &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;char&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; беззнаковый и используется для представления символов Unicode. &lt;/li&gt;&lt;li&gt;Тип &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;boolean&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; принимает только два значения: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;true&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;false&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;Массивы должны быть (в порядке перечисления): &lt;/li&gt;&lt;ol&gt;&lt;li&gt;Объявлены &lt;/li&gt;&lt;li&gt;Созданы &lt;/li&gt;&lt;li&gt;Инициализированы &lt;/li&gt;&lt;/ol&gt;&lt;li&gt;Инициализация по умолчанию может быть применена и к переменным членам класса, и к элементам массивов, но не к автоматическим переменным (создаются в методе или передаются в него параметром). Значения по умолчанию: 0 - для численных типов, &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для ссылок на объекты и для типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;char&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;false&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;boolean&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. &lt;/li&gt;&lt;li&gt;Член &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;length&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; массивов возвращает количество элементов в массиве. &lt;/li&gt;&lt;li&gt;Класс с методом &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;main()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; может быть вызван из командной строки, как Java приложение. Сигнатура для этого метода: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public static void main(String[] args)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, где аргумент &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;args&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; содержит все параметры входной строки, которые идут следом за именем класса. &lt;/li&gt;&lt;li&gt;Параметры метода - копии, а не оригиналы. Для параметров примитивных типов это означает, что модификации переменных внутри вызываемого метода не видны методу вызывающему. Для параметров объектого типа (в том числе и для массивов) это тоже имеет место, но модификация &lt;u&gt;объекта или массива&lt;/u&gt;, на который &lt;u&gt;ссылается параметр&lt;/u&gt;, &lt;em&gt;видна&lt;/em&gt; в вызывающем методе. &lt;/li&gt;&lt;li&gt;Сборщик мусора может освободить память, если ясно, что она больше не используется. &lt;/li&gt;&lt;li&gt;Достоверная сборка мусора невозможна. &lt;/li&gt;&lt;li&gt;Невозможно предсказать, когда неиспользуемая память будет освобождена. &lt;/li&gt;&lt;li&gt;Сборка мусора не гарантирует, что не случится утечка памяти, которая может иметь место, если ссылки на неиспользуемые объекты не установлены в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или не уничтожены (например, с выходом из вызываемого метода). &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-220807098457545737?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/220807098457545737/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=220807098457545737' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/220807098457545737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/220807098457545737'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/3_27.html' title='Резюме по основам языка (Выпуск 3)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-6041117037908507023</id><published>2008-04-27T12:40:00.000-07:00</published><updated>2008-04-27T12:50:44.174-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='основы языка'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 1'/><category scheme='http://www.blogger.com/atom/ns#' term='передача параметров'/><category scheme='http://www.blogger.com/atom/ns#' term='garbage collection'/><category scheme='http://www.blogger.com/atom/ns#' term='сбощик мусора'/><title type='text'>Передача параметров, сборщик мусора (Выпуск 3)</title><content type='html'>&lt;h2&gt;1. Основы языка (окончание)&lt;/h2&gt;&lt;h3&gt;1.7. Передача параметров&lt;/h3&gt;&lt;p&gt;&lt;small&gt;&lt;span style="font-size:130%;"&gt;Параметр = Аргумент (&lt;em&gt;argument&lt;/em&gt;)&lt;/span&gt;&lt;/small&gt;&lt;/p&gt;&lt;p&gt;При передаче параметров при вызове функции в Java, на самом деле передаётся &lt;em&gt;копия параметра&lt;/em&gt;. Рассмотрим фрагмент кода: &lt;/p&gt;&lt;p&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. double radians = 1.2345;&lt;br /&gt;2. System.out.println("Синус от " + radians + " = " + Math.sin(radians)); &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Переменная &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;radians&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; состоит из битового шаблона, который представляет собой число 1.2345. Во второй строке копия этого битового шаблона передаётся в аппарат вызывания методов Виртуальной Java Машины (Java Virtual Machine, JVM).&lt;/p&gt;&lt;p&gt;Когда параметр передаётся в метод, изменения значения параметра методом не отражаются на исходном значении параметра вне метода. Для наглядности рассмотрим пример:&lt;/p&gt;&lt;p&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. public void bumper(int bumpMe) {&lt;br /&gt;2. bumpMe += 15;&lt;br /&gt;3. } &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Метод &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;bumper&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; вызывается в следующем коде:&lt;/p&gt;&lt;p&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. int xx = 12345;&lt;br /&gt;2. bumper(xx);&lt;br /&gt;3. System.out.println("Сейчас xx равен " + xx);&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Во второй строке &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;xx&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; копируется и передаётся в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;bumper()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, который изменяет значение 12345 на 12360 (+15). Но в третьей строке выводится всё равно 12345, потому что вне метода &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;bumper()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; значение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;xx&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; не изменяется.&lt;/p&gt;&lt;p&gt;Это также имеет место, когда передаваемый параметр объект, а не переменная примитивного типа. Однако эффект совсем другой. Для понимания этого, рассмотрим концепцию &lt;em&gt;ссылки на объект&lt;/em&gt;. Java программы не работают непосредственно с объектами. Когда конструктор создаёт объект, то возвращает некое значение, битовый шаблон, который уникальным образом идентифицирует объект. Это значение называется &lt;em&gt;ссылка на объект&lt;/em&gt;. Например, рассмотрим следующий код:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. Button btn;&lt;br /&gt;2. btn = new Button("Ok");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;Во второй строке конструктор &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Button&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; возвращает ссылку на только что созданнную кнопку посредством переменной &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;btn&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Это не сам объект и не его копия, но ссылка на объект. Например, в некоторых имплементациях JVM ссылка - это адрес объекта.&lt;/p&gt;&lt;p&gt;&lt;span class="lyric"&gt;В большинстве JVM, на самом деле, значение ссылки - адрес адреса, где второй адрес - адрес объекта. Этот подход называется &lt;em&gt;двойная адресация&lt;/em&gt; и используется сборщиком мусора (описан далее в этом выпуске) для перераспределения объектов с целью уменьшения дефрагментации памяти.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Рассмотрим следующий фрагмент кода:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. Button btn;&lt;br /&gt;2. btn = new Button("Pink");&lt;br /&gt;3. replacer(btn);&lt;br /&gt;4. System.out.println(btn.getLabel());&lt;br /&gt;5.&lt;br /&gt;6. public void replacer(Button replaceMe) {&lt;br /&gt;7. replaceMe = new Button("Blue");&lt;br /&gt;8. }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;Во второй строке создаётся кнопка, ссылка на которую сохраняется в переменной &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;btn&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. В третьей строке копия ссылки на кнопку Pink передаётся в метод &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;replacer()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, который (в строке 7) создаёт вторую кнопку Blue, ссылку на которую сохраняет в переданном параметре &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;replaceMe&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Но вне метода &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;replacer()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; ссылка на кнопку Pink остаётся той же самой, поэтому строка 4 напечает Pink.&lt;/p&gt;&lt;p&gt;Таким образом, вызываемый метод не изменяет значение параметра вызывающего метода, то есть значения передаваемых параметров сохраняются вызывающим методом. Однако, когда вызываемый метод &lt;em&gt;производит операции&lt;/em&gt; над объектами через значение ссылки, передаваемой как параметр, последствия могут быть другими. Иными словами, если вызываемый метод модифицирует объект через саму ссылку, то изменения видны вызывающему методу. Если мы в предыдущем примере седьмую строку заменим на&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;7. replaceMe.setLabel("Blue");&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;то, хоть переданная ссылка &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;btn&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и та же самая, что и в предыдущей версии примера, но сам объект изменён. Ссылка на объект не изменяется, но используется для доступа к самому объекту. В результате четвёртая строка выдаст Blue в выходном потоке.&lt;/p&gt;&lt;p&gt;Массивы - это объекты, а значит, программы работают со ссылками на них, а не непосредственно с ними. То есть при передаче ссылки на массив в некоторый метод, возможно изменить содержимое массива, хранимого в вызывающем методе.&lt;/p&gt;&lt;h4&gt;Как создать ссылку на переменную примитивного вида&lt;/h4&gt;&lt;p&gt;Это полезная техника для для создания эффекта передачи переменных примитивного вида по ссылке (когда вызываемый метод может изменять значение переменной). В вызываемый метод достаточно просто передать массив, состоящий из одного элемента, которым является заданная переменная. В коде это будет выглядеть, например, так:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. public class PrimitiveReference {&lt;br /&gt;2. public static void main(String args[]) {&lt;br /&gt;3. int [] myValue = { 1 };&lt;br /&gt;4. modifyIt(myValue);&lt;br /&gt;5. System.out.println("myValue contains " + myValue[0]);&lt;br /&gt;6. }&lt;br /&gt;&lt;br /&gt;7. public static void modifyIt(int [] value) {&lt;br /&gt;8. value[0]++;&lt;br /&gt;9. }&lt;br /&gt;10. }&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;1.8. Сборщик мусора (&lt;em&gt;Garbage Collection&lt;/em&gt;)&lt;/h3&gt;&lt;p&gt;Большинство современных языков программирования позволяют выделять память во время выполнения программы. В Java это делается явно тогда, когда используется оператор &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; для создания объекта, и неявно - когда вызывается метод, который имеет локальные переменные или параметры. В случае неявного выделения памяти используется стековое пространство, которое освобождается, как только совершается выход из метода. В случае явного выделения памяти (под объекты) используется пространство кучи (&lt;em&gt;heap&lt;/em&gt;). Освобождение этой памяти не так тривиально, но об этом поговорим ниже.&lt;/p&gt;&lt;p&gt;&lt;span class="remember"&gt;Пространство кучи используется для объектов даже тогда, когда они создаются в вызываемом методе. Например, в&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public void aMethod() {&lt;br /&gt;MyClass mc = new MyClass();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;локальная переменная &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;mc&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - это ссылка, память для которой выделяется в стеке. Но память для объекта типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;MyClass&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, на который ссылается &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;mc&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, выделяется в куче. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;В этой части мы рассмотрим освобождение памяти в куче, выделенной для объектов. Мы должны ответить на вопрос: &lt;strong&gt;когда мы можем освободить эту память?&lt;/strong&gt; Некоторые языки программирования обязывают программиста явно освобождать память, когда он заканчивает с ней работать. На практике оказалось, что при таком подходе возникает много ошибок, поскольку программист мог или освободить память раньше, чем нужно (вызывая потерю данных), или забыть совсем об её освобождении (провоцируя недостаток памяти). Сборщик мусора в Java полностью решает первую проблему и значительно упрощает вторую.&lt;/p&gt;&lt;p&gt;В Java вы никогда не освобождаете память явно. Во время выполнения программы выделяемая память и её использование отслеживается. Это выполняется в фоновом режиме потоком (&lt;em&gt;Thread&lt;/em&gt;, который называется сборщик мусора), имеющим низкую приоритетность. Как только сборщик мусора находит память, которая не достижима ни из одного из действующих потоков, он освобождает её обратно в кучу для последующего использования.&lt;/p&gt;&lt;p&gt;Сбор мусора может быть осуществлён разными способами, каждый из которых имеет свои недостатки и преимущества в зависимости от типа выполняемой программы. Для систем контроля в реальном времени, например, необходимо обеспечивать беспрепятственную реакцию на прерывания. Сборка муссора для таких приложений должна производиться часто, в коротких временных интервалах и должна быть легко прерываема. Программы, которые интенсивно используют память, работают лучше, если сборка муссора проводится редко и быстро. В настоящее время сборщик мусора "зашит" (&lt;em&gt;hardcoded&lt;/em&gt;) в систему выполнения Java программ и болшинство его алгоритмов используют компромис между выгрузкой и реактивностью (способность к реагированию). В будущем, наверное, будет возможно подключать различные сборщики мусора (или JVM) с различными алгоритмами в зависимости от наших нужд. По крайней мере, мы себе этого желаем.&lt;/p&gt;&lt;p&gt;Однако мы до сих пор не ответили явно на вопрос, поставленный вначале. Самый лучший ответ: &lt;strong&gt;память не освобождается до тех пор, пока она используется&lt;/strong&gt;. Даже если объект больше не используется, нельзя уверенно сказать, когда память, выделенная под него, будет освобождена. Это может случиться через 1 милисекунду, или через 100 милисекунд, или не случиться вовсе. Методы &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;System.gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Runtime.gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; выглядят, как "запустить сборщик мусора", но и на них нельзя полагаться, поскольку другие более приоритетные потоки могут отложить их выполнение. И на самом деле, документация для методов &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;gc()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; гласит: "Вызов этих методов &lt;em&gt;подразумевает&lt;/em&gt;, что JVM приложит усилия для переработки неиспользуемых объектов".&lt;/p&gt;&lt;p&gt;Сама природа автоматического сбора мусора имеет важное последствие: утечка памяти (ведущая к её нехватке) всё ещё может иметь место. Достижимые ссылки на неиспользуемые объекты позволяют последним занимать память и не быть обработанными сборщиком мусора. Решением этой проблемы может быть явное присвоение &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;null&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; значения ссылке на объект, который вам уже не нужен. Это особенно просто в случае имплементации коллекции. Например, пусть массив &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;storage&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; используется для реализации стека. Типичная имплементация метода &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;pop()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; такова:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. public Object pop() {&lt;br /&gt;2. return storage[index--];&lt;br /&gt;3. }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;Если метод, вызывающий &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;pop()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, не позаботится о вытолкнутом объекте после его использования, память для этого объекта не будет освобождена до тех пор, пока не произойдёт выход из вызывающего метода или пока ссылка на этот объект (находящаяся в массиве &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;storage&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;) не будет перезаписана. Это может занять много времени. Для ускорения процесса, метод &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;pop()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; может быть модифицирован следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. public Object pop() {&lt;br /&gt;2. Object returnValue = storage[index];&lt;br /&gt;3. storage[index--] = null;&lt;br /&gt;4. return returnValue;&lt;br /&gt;5. } &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-6041117037908507023?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/6041117037908507023/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=6041117037908507023' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/6041117037908507023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/6041117037908507023'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/3.html' title='Передача параметров, сборщик мусора (Выпуск 3)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-2224623291743176787</id><published>2008-04-27T12:26:00.000-07:00</published><updated>2008-04-27T12:51:24.318-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='массивы'/><category scheme='http://www.blogger.com/atom/ns#' term='литералы'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 1'/><category scheme='http://www.blogger.com/atom/ns#' term='основы язык'/><title type='text'>Литералы, массивы, основы классов (Выпуск 2)</title><content type='html'>&lt;h2&gt;1. Основы языка (продолжение)&lt;/h2&gt;&lt;h3&gt;1.4. Литералы&lt;/h3&gt;&lt;p&gt;&lt;em&gt;Литерал&lt;/em&gt; - это костанта (не литерал - это значение определённое во время выполнения программы, например, сумма двух дитералов). Литералы могут являться значениями переменных как примитивных, так и строковых типов. Они появляются в присвоении значения (assignment) справа или в вызовах методов. Вы не можете присвоить какое-то значение литералу, то есть литералы не могут находиться слева в утверждении присвоения. &lt;/p&gt;&lt;h4&gt;1.4.1. Литералы типа &lt;em&gt;boolean&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Единственные правомерные литералы типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;boolean&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;true&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;false&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Например:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. boolean isBig = true;&lt;br /&gt;2. boolean isLittle = false;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;Здесь &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;boolean isBig = true;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - это утверждение присвоения, &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;boolean isBig&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - это объявление переменной &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;isBig&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;boolean&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;true&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - это литерал. Заметьте, что литерал находится справа. &lt;/p&gt;&lt;h4&gt;1.4.2. Литералы типа &lt;em&gt;char&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Литералы типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;char&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; могут быть выражены как символ в одинарных кавычках. Например:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;char c = 'w'; &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Естественно, это справедливо только для символов, которые могут быть набраны на клавиатуре. Ещё один способ выражения символьных литералов - Unicode значение, специфицированое четырьмя шестнадцатиричными цифрами, следующими за &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;\u&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Всё выражение должно быть взято в одинарные кавычки. Например:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;char c1 = '\u4567'; &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Специальные символы в Java выражаются так: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\n'&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для новой строки; &lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\r'&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для возврата каретки на начало строки; &lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\t'&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для табуляции; &lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\b'&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для возврата каретки на одну позицию назад; &lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\f'&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для новой страницы; &lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\''&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для одинарной кавычки; &lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\"'&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для двойной кавычки; &lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;'\\'&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - для обратной наклонной линии. &lt;/li&gt;&lt;/ul&gt;&lt;span class="fullpost"&gt;&lt;h4&gt;1.4.3. Целочисленные литералы&lt;/h4&gt;&lt;p&gt;Целочисленные литералы могыт быть выражены в десятичной, восьмеричной (префикс литерала - 0) и шестнадцатиречной (префикс литерала - 0х или 0Х) форме. В последнем случае и верхний и нижний регистр может использоваться. Например, 28 может быть выражено шесьтью способами: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;28 &lt;/li&gt;&lt;li&gt;034 &lt;/li&gt;&lt;li&gt;0х1с &lt;/li&gt;&lt;li&gt;0х1С &lt;/li&gt;&lt;li&gt;0Х1с &lt;/li&gt;&lt;li&gt;0Х1С &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;p&gt;По умолчанию целочисленный литерал занимает 32 бита. Чтобы указать 64-хбитовый (&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;long&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;) литерал, нужно добавить суффикс &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;L&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; к литеральному выражению. (Можно указывать &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;l&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и в нижнем регистре, но тогда этот суффикс выглядит как &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; (единица), что может привести к конфузам при чтении кода). &lt;/p&gt;&lt;h4&gt;1.4.4. Литералы с плавающей точкой&lt;/h4&gt;&lt;p&gt;Литерал &lt;em&gt;с плавающей точкой&lt;/em&gt; выражает число с плавающей точкой. Для того, чтобы считаться литералом с плавающей точкой, численное выражение должно удовлетворять одной из следующих опций: &lt;/p&gt;&lt;ul&gt;&lt;li&gt;десятичная точка: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1.414&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;Буква &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;E&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;e&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, указывающая на научную нотацию: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;4.23E+21&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;Суффикс &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;F&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;f&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, указывающий на литерал типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;float&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1.828f&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;Суффикс &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;D&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;d&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, указывающий на литерал типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1234d&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Литерал с плавающей точкой без суффикса &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;F&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;D&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; по умолчанию является литералом типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. &lt;/p&gt;&lt;p&gt;&lt;span class="remember"  style="color:#cc0000;"&gt;Если вы присваиваете переменной литеральное значение, например, &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;short s = 9;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, компилятор определяет размер литерала согласно типу переменной. Поэтому, только что показанное присвоение сработает без ошибок. Однако, выражение с переменными, как, например, &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;short s1 = 9 + s;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, выдаст ошибку компиляции, потому что тип выражения &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;9 + s&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; есть &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;int&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, а не &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;short&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. &lt;/span&gt;&lt;/p&gt;&lt;h4&gt;1.4.5. Строковые литералы&lt;/h4&gt;&lt;p&gt;&lt;em&gt;Строковый литерал&lt;/em&gt; - это последовательность символов, заключённых в двойные кавычки. Например: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;String s = "Characters in strings are 16-bit Unicode.";&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. &lt;/p&gt;&lt;p&gt;Java включает в себя много различных средств для определения не литеральных строковых значений, например: операторы конкатенации, некоторые сложные конструкторы для класса &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;String&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Эти способы мы рассмотрим в других номерах рассылки. &lt;/p&gt;&lt;h3&gt;1.5. Массивы (&lt;em&gt;Arrays&lt;/em&gt;)&lt;/h3&gt;&lt;p&gt;Массивы в Java - это нумерованные коллекции литералов/переменных/выражений примитивных типов, указателей на объекты или других массивов. Массивы в Java однородные, то есть все элементы в массиве должны быть одного типа, за исключением случаев, разрешённых полиморфизмом. Иными словами, когда вы создаёте массив, вы должны определить тип элементов, которые могут в нём содержаться. Если тип не примитивный, а определённый через класс, то реальный массив, помимо объектов заданного класса, может содержать также объекты подклассов того класса, который был указан в объявлении массива. &lt;/p&gt;&lt;p&gt;Массив создаётся последовательностью трёх шагов: объявление, создание и инициализация.&lt;/p&gt;&lt;p&gt;В объявлении содержится имя массива, и тип его допустимых элементов. Например:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. int[] ints; // массив, состоящий из элементов примитивного типа int&lt;br /&gt;2. double[] dubs; // массив, состоящий из элементов примитивного типа double&lt;br /&gt;3. Dimension[] dims; // массив из указателей на объекты (Dimension - класс в пакете java.awt)&lt;br /&gt;4. float[][] twoDee; // двухмерный массив (т.е. массив массивов) из элементов типа float &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Квадратные скобки могут идти и до, и после названия массива. Это также имеет место в декларации методов. Например, метод, который принимает массив элементов типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; как параметр, может быть объявлен так: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;takeMethod(double[] dubs)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;takeMethod(double dubs[])&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Метод, который возвращает массив элементов типа &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, может быть объявлен как &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double[] returnMethod()&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; или &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;double returnMethod()[]&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Первый способ, лично для меня, более удобен для чтения.&lt;/p&gt;&lt;p&gt;Заметьте, что при объявлении массива не указывается его размер, т.е. число элементов, в него входящих. Размер определяется в момент выполнения программы, когда память под массив выделяется через ключевое слово &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;new&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Например:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. int[] ints; // Объявление массива&lt;br /&gt;2. ints = new int[25]; // Создание массива во время выполнения программы&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Поскольку размер массива используется только во время выполнения программы, допустимо определять размер массива через переменную, а не через литерал. Например:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;1. int size = 1152 * 900;&lt;br /&gt;2. int[] raster;&lt;br /&gt;3. raster = new int[size]; &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Объявление и создание массива может быть задано одной строкой:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;int[] ints = new int[25];&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;Когда массив создан, его элементы автоматически инициализируются значениями по умолчанию согласно Таблице 1.4.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;table width="70%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="BORDER-BOTTOM: black 2pt solid" colspan="4"&gt;&lt;br /&gt;&lt;p&gt;Таблица 1.4: Значения по умолчанию для инициализации элементов массива&lt;br /&gt;&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: Arial; TEXT-ALIGN: left"&gt;&lt;th&gt;Тип элемента&lt;/th&gt;&lt;th&gt;Значение по умолчанию&lt;/th&gt;&lt;th&gt;Тип элемента&lt;/th&gt;&lt;th&gt;Значение по умолчанию&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-SIZE: 1pt; BORDER-BOTTOM: black 1pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;&lt;td&gt;byte&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;short&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;0&lt;/td&gt;&lt;td&gt;long&lt;/td&gt;&lt;td&gt;0L&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;&lt;td&gt;float&lt;/td&gt;&lt;td&gt;0.0f&lt;/td&gt;&lt;td&gt;double&lt;/td&gt;&lt;td&gt;0.0d&lt;/td&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;&lt;td&gt;char&lt;/td&gt;&lt;td&gt;'\u0000'&lt;/td&gt;&lt;td&gt;boolean&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-SIZE: 14pt; FONT-FAMILY: Courier; TEXT-ALIGN: right" colspan="2"&gt;указатель на объект&lt;/td&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier" colspan="2"&gt;null&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-TOP: black 2pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;&lt;span class="lyric"&gt;Методы (и атрибуты) для Java объекта вызываются через точку: &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;имяОбъекта.имяМетода&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; (соответсвенно &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;имяОбъекта.имяАтрибута&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;).&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="remember"  style="color:#990000;"&gt;На самом деле, массивы - это объекты, вплоть до того, что вы можете вызывать методы (через точку!) для них (в большинстве своём - это методы класса &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Object&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;), хотя вы и не можете создавать подклассы для массивов. &lt;/span&gt;&lt;/p&gt;&lt;p&gt;Если вы хотите инициализировать массив другими значениями, отличными от тех, что приведены в Таблице 1.4, вы должны комбинировать объявление, создание и инпициализацию в одной строке. Например, массив из пяти опредённых чисел с плавающей точкой задаётся так:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;&lt;span class="src"&gt;float[] diameters = {1.1f, 2.2f, 3.3f, 4.4f, 5.5f};&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;Размер массива вычисляется автоматически и равен числу элементов в фигурных скобках. &lt;/p&gt;&lt;p&gt;Конечно же массив может быть также инициализирован явным присвоением значенией каждому элементу массива:&lt;/p&gt;&lt;pre&gt;1. long[] squares;&lt;br /&gt;2. squares = new long[6000]; // массив создан, его значения по умолчанию равны 0L&lt;br /&gt;3. for (int i = 0; i &amp;lt; 6000; i++) {&lt;br /&gt;4.  squares[i] = i * i; // значения по умолчанию изменены&lt;br /&gt;5. }&lt;/pre&gt;&lt;p&gt;Если в приведенном примере размер массива поменяется (строка 2), то цикл в строке 3 может функционировать с ошибками. Для целостности программы мы перепишем строку 3 следующим образом:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;3. for (int i = 0; i &amp;lt; squares.length; i++) { // length - встроенный атрибут массива, обозначающий длину массива&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;&lt;span class="lyric"&gt;Нумерация элементов в массиве начинается с нуля (0).&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span class="remember"  style="color:#cc0000;"&gt;В Java можно создавать непрямоугольные массивы. Поскольку многомерные массивы - это массив подмассивов, а каждый подмассив - это отдельный объект, размеры подмассивов могут быть различны. Но в этом случае будьте внимательны с итерацией по массиву. &lt;/span&gt;&lt;/p&gt;&lt;h3&gt;1.6. Основы классов&lt;/h3&gt;&lt;p&gt;Java построена на классах. Более детальное изучение классов мы разберём в других выпусках рассылки. Сейчас же обратимся к базовым понятиям. &lt;/p&gt;&lt;h4&gt;1.6.1. Метод &lt;em&gt;main()&lt;/em&gt;&lt;/h4&gt;&lt;p&gt;Метод &lt;em&gt;main()&lt;/em&gt; - это входная точка в приложениях, написанных на Java. То есть для создания приложения, вы пишете класс, в котором присутствует метод &lt;em&gt;main()&lt;/em&gt;. Для выполнения приложения наберите в командной строке &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;java&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и имя класса с методом &lt;em&gt;main()&lt;/em&gt;. &lt;/p&gt;&lt;p&gt;Форма задания (сигнатура) метода &lt;em&gt;main()&lt;/em&gt; такова:&lt;br /&gt;&lt;br /&gt;&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public static void main(String[] args)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &lt;/p&gt;&lt;p&gt;Заметьте, метод &lt;em&gt;main()&lt;/em&gt; объявлен, как общедоступный (&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;public&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;). Кроме того, требуется, чтобы он был также статическим (&lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;static&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;), что означает, что он может быть вызван без создания соответсвующего объекта. &lt;/p&gt;&lt;p&gt;Параметр &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;args&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - аргументы, которые пользователь ввёл в командную строку после имени класса. Например:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;&lt;span class="src"&gt;% java Mapper France Belgium&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;означает, что классу &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Mapper&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; в командной строке было передано два аргумента &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;France&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;, помещённый в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;args[0]&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; и &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;Belgium&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; - в &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;args[1]&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;. Имя массива &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;args&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; может быть заменено любым допустимым именем переменной. Главное, что его тип - массив строк. &lt;/p&gt;&lt;h4&gt;1.6.2. Переменные и инициализация&lt;/h4&gt;&lt;p&gt;Java поддерживает переменные двух типов, зависящих от области видимости переменной: &lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;em&gt;Член класса&lt;/em&gt;: создаётся (уничтожается) при создании (уничтожении) объекта класса. Может иметь явное объявление доступности (общедоступный, защищённый или приватный). Вызывается через обращение к объекту класса. Видимость до закрывающей скобки класса. &lt;/li&gt;&lt;li&gt;&lt;em&gt;Автоматическая переменная метода&lt;/em&gt;: создаётся в методе или передаётся в него параметром. Существует во время выполнения метода и, следовательно, видна внутри метода и доступна во время выполнения метода. (Исключения бывают во внутренних классах, но о них мы поговорим в других выпусках рассылки.) &lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;p&gt;Все переменные первого типа, которым не были присвоены явные значения, автоматически инициализируются значением по умолчанию, которое зависит от типа переменной (см. Таблицу 1.4). &lt;/p&gt;&lt;br /&gt;&lt;p&gt;Член класса может быть инициализирован в строке объявления:&lt;/p&gt;&lt;pre&gt;1. class HasVariables {&lt;br /&gt;2.  int x = 20; // x устанавливается в значение 20 перед вызовом конструктора класса HasVariables&lt;br /&gt;3.  static int y = 30; // y принимает значение 30 в момент загрузки класса HasVariables&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;При таком способе, нестатические переменные инициализируются перед вызовом конструктора класса, а статические переменные инициализируются в момент загрузки класса. &lt;/p&gt;&lt;p&gt;Автоматические переменные (также известные как локальные перемнные (&lt;em&gt;local variables&lt;/em&gt;)) не инициализируются системой, но должны быть явно инициализированы перед использованием. Например, этот код не откомпилируется: &lt;/p&gt;&lt;pre&gt;1. public int wrong() {&lt;br /&gt;2.  int i;&lt;br /&gt;3.  return i+5;&lt;br /&gt;4. }&lt;/pre&gt;&lt;p&gt;Ошибка компиляции в строке 3 "Variable &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;i&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; may not have been initialized." (Переменная i, возможно, не инициализирована) возникает часто потому, что некоторые программисты начинают использовать переменные раньше, чем инициализируют их. &lt;/p&gt;&lt;pre&gt;1.public double fourthRoot(double d) {&lt;br /&gt;2.  double result;&lt;br /&gt;3.      if (d &amp;gt;= 0) { // использование раньше, чем инициализация&lt;br /&gt;4.          result = Math.sqrt(Math.sqrt(d)); // инициализация&lt;br /&gt;5.      }&lt;br /&gt;6.  return result;&lt;br /&gt;7. }&lt;/pre&gt;&lt;p&gt;В шестой строке компилятор выдаст ошибку "Variable &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;result&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; may not have been initialized". Для того, чтобы этого не произошло, перепишем строку 2 следуюшим образом:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;&lt;span class="src"&gt;2. double result = 0.0; // Инициализация&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;Теперь переменная &lt;span class="src"&gt;&lt;strong&gt;&lt;span style="font-family:Courier;"&gt;result&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; инициализирована. Только что показанная модификация строки 2 демонстрирует, что автоматические перемнные могут быть инициализированы в строке объявления. Хотя инициализация в отдельной строке тоже возможна. &lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-2224623291743176787?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/2224623291743176787/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=2224623291743176787' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/2224623291743176787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/2224623291743176787'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/2.html' title='Литералы, массивы, основы классов (Выпуск 2)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8592713917061554150.post-3234594062834754070</id><published>2008-04-27T11:09:00.000-07:00</published><updated>2009-02-25T07:17:25.997-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='основы языка'/><category scheme='http://www.blogger.com/atom/ns#' term='типы данных'/><category scheme='http://www.blogger.com/atom/ns#' term='глава 1'/><title type='text'>Основы языка Java (Выпуск 1)</title><content type='html'>&lt;p&gt;В первом выпуске мы с места в карьер ознакомимся с базовыми понятиями языка программирования Java. Очень можно долго писать вступление и объяснять, что такое Java, и зачем он (язык) нужен, и как он организован. Можно обратить внимание, что для выполнения программ на Jave необходимо генерировать объектный код, а не исполняемый, нудно рассказывать про трансляторы и компиляторы... Я решила, что лучше сразу приступить к изучению. Если что-то не понятно, пишите мне письма, пожалуйста. Я с радостью отвечу на все вопросы.&lt;/p&gt;&lt;h2&gt;1. Основы языка&lt;br /&gt;&lt;/h2&gt;&lt;h3&gt;1.1. Исходные файлы&lt;/h3&gt;&lt;p&gt;Все исходные файлы (они же "исходники"), написанные в Java, должны заканчиваться расширением &lt;span class="src"&gt;.java&lt;/span&gt;. Файл должен содержать по крайней мере одно открытое и общедоступное (&lt;span class="src"&gt;public&lt;/span&gt;) определение класса.&lt;/p&gt;&lt;span class="lyric"&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;Лирическое отступление для совсем новичков&lt;/u&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Java - объектно-ориетированный язык, то есть одним из основных его понятий является "объект", служащий для построения решения проблемы как кирпичи иблоки служат для построения дома). Объект может быть классифицирован (красные и белые кирпичи - они и в Африке кирпичи), отсюда и следует слово "класс", то есть тип строительного материала. Принципы объектно-ориентированного программирования (ООП) мы рассмотрим в следующих выпусках.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;А пока что считаем, что класс - это неименное существительное без прилагательного: стол, кирпич, животное, кошка, человек и т.д. Объект - это отдельный конкретный пример класса. Класс, который описывает все существующие объекты называется "объект". Вот такая валюта - "деньги".&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;span class="fullpost"&gt;&lt;p&gt;Если общедоступное определение класса присутствует, оно должно совпадать с именем файла без расширения. Например, если исходник содержит класс &lt;span class="src"&gt;Apple&lt;/span&gt;, то файл должен называться &lt;span class="src"&gt;Apple.java&lt;/span&gt;. Исходник может содержать неограниченное число не общедоступных определений классов.&lt;/p&gt;&lt;span class="lyric"  style="color:#000099;"&gt;Это не является требованием языка, но его лучше придерживаться дабы не нарушить переносимость вашего кода на другие платформы (отличные от той, на которой вы ухитрились запустить программу, исходник которой не соответсвует этому требованию.)&lt;/span&gt; &lt;p&gt;Три элемента верхнего уровня известные как &lt;i&gt;единицы компиляции (compilation units)&lt;/i&gt; могут также присутствовать в файле: &lt;ol&gt;&lt;li&gt;Объявление пакета (&lt;i&gt;package declaration&lt;/i&gt;); например,&lt;span class="src"&gt;package exam.problems;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Утверждение импорта (&lt;i&gt;imposrt statement&lt;/i&gt;); например, &lt;span class="src"&gt;import java.awt.Button; // импортирует специфический класс import java.util.*; // импортирует целый пакет&lt;/span&gt;; &lt;/li&gt;&lt;li&gt;Определение класса (&lt;i&gt;class definition&lt;/i&gt;); например, &lt;span class="src"&gt;public class Test {...}&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Формат объявления пакета очень прост. Сначала идёт ключевое слово &lt;span class="src"&gt;package&lt;/span&gt;, за которым следует название пакета. А название пакета, в свою очередь, состоит из последовательности определённых элементов, разделённых точкой. Эта последовательность элементов отображает иерархию директорий на диске. В директорию с именем последнего элемента последовательности и находится класс. Рассмотрим пример выше: класс с таким объявлением пакета помещается в директорию &lt;span class="src"&gt;problems&lt;/span&gt;, которая размещена в директории &lt;span class="src"&gt;exam&lt;/span&gt;. &lt;p&gt;Вы должны быть внимательны, именуя каждый элемент последовательности: имена директории должны быть допустимы на любой платформе. То есть попросту элементы последовательности могут содержать буквы, цифры, символ подчёркивания и символ доллара.&lt;/p&gt;&lt;span class="lyric"&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;Лирическое отступление для совсем новичков&lt;/u&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Пакеты представляют собой совокупность классов логически связанных между собой. Например, пакет "деньги" может содержать классы "ДолларСША", "Евро", "РоссийскийРубль", "КурсВалют". Пакет(директория) "деньги" может находиться в директории "активы", и тогда объявление пакета имеет вид: &lt;span class="src"&gt;package assets.money;&lt;/span&gt;, где &lt;i&gt;assets&lt;/i&gt; - "активы", а &lt;i&gt;money&lt;/i&gt; - "деньги", ясное дело.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;Утверждение импорта имеет похожую структуру, за исключением того, что можно импортировать как индивидуальный класс, так и весь пакет целиком. В первом случае, после елючевого слова &lt;span class="src"&gt;import&lt;/span&gt; вы должны написать полный путь к классу и завершить утверждение точкой с запятой. Во втором случае, нужно просто добавить символ звёздочки после имени директории, в которой находится импортируемый пакет.&lt;/p&gt;&lt;span class="lyric"&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;Лирическое отступление для совсем новичков&lt;/u&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Импортирование пакетов (классов) необходимо объявлять в том случае, если классы этих пакетов (эти классы) используются в текущем классе. Например, в класс "ОплатавМагазине" мы импортируем класс "РоссийскийРубль", то есть пишем: &lt;span class="src"&gt;import assets.money.RussianRuble;&lt;/span&gt;, где &lt;i&gt;RussianRuble&lt;/i&gt; означает "РоссийскийРубль". А в класс "ОплатаНаЧёрномРынке" мы пишем: &lt;span class="src"&gt;import assets.money.*;&lt;/span&gt;, потому что нам могут понадобиться все заявленные валюты и их курс.&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;p&gt;Детальное определение класса мы рассмотрим в следующих выпусках.&lt;/p&gt;&lt;p&gt;Пробелы и коментарии могут предшествовать любой единице компиляции. Например, класс &lt;span class="src"&gt;Test&lt;/span&gt; может иметь такой вид:&lt;br /&gt;&lt;span class="src"&gt;&lt;br /&gt;1. // Объявление пакета&lt;br /&gt;2. package exam.prepguide;&lt;br /&gt;3.&lt;br /&gt;4. // Импорты&lt;br /&gt;5. import java.awt.Button; // импортирует специфический класс&lt;br /&gt;6. import java.util.*; // импортирует целый пакет&lt;br /&gt;7.&lt;br /&gt;8. // Определение класса&lt;br /&gt;9. public class Test {...}&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;span class="remember"  style="color:#cc0000;"&gt;Случается, что существуют два класса с одинаковым именем, но в разных пакетах. Например, &lt;span class="src"&gt;Date&lt;/span&gt; класс в &lt;span class="src"&gt;java.util&lt;/span&gt; и в &lt;span class="src"&gt;java.sql&lt;/span&gt;. Если вы используете звёздочку для импорта обоих пакетов, а затем пытаетесь использовать класс названный просто &lt;span class="src"&gt;Date&lt;/span&gt;, вы получите ошибку компиляции о том, что такое использование неоднозначно. Вы должны или сделать явный импорт класса, или обращаться к классу, используя полный путь к нему.&lt;/span&gt;&lt;/p&gt;&lt;h3&gt;1.2. Ключевые слова и дентификаторы&lt;/h3&gt;&lt;p&gt;В языке Java существует 52 ключевых и зарезервированных слов. Они приведены в Таблице 1.1.&lt;/p&gt;&lt;center&gt;&lt;br /&gt;&lt;table width="75%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: black 2pt solid" colspan="7"&gt;&lt;p&gt;Таблица 1.1: Ключевые и зарезервированые слова в Java&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; FONT-FAMILY: Courier"&gt;&lt;td style="MARGIN-LEFT: 5pt; MARGIN-RIGHT: 5pt"&gt;abstract&lt;/td&gt;&lt;td&gt;class&lt;/td&gt;&lt;td&gt;false&lt;/td&gt;&lt;td&gt;import&lt;/td&gt;&lt;td&gt;package&lt;/td&gt;&lt;td&gt;super&lt;/td&gt;&lt;td&gt;try&lt;/td&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; FONT-FAMILY: Courier"&gt;&lt;td&gt;assert&lt;/td&gt;&lt;td&gt;const&lt;/td&gt;&lt;td&gt;final&lt;/td&gt;&lt;td&gt;instanceof&lt;/td&gt;&lt;td&gt;private&lt;/td&gt;&lt;td&gt;switch&lt;/td&gt;&lt;td&gt;void&lt;/td&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; FONT-FAMILY: Courier"&gt;&lt;td&gt;boolean&lt;/td&gt;&lt;td&gt;continue&lt;/td&gt;&lt;td&gt;finally&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;protected&lt;/td&gt;&lt;td&gt;syncronized&lt;/td&gt;&lt;td&gt;volatile&lt;/td&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; FONT-FAMILY: Courier"&gt;&lt;td&gt;break&lt;/td&gt;&lt;td&gt;default&lt;/td&gt;&lt;td&gt;float&lt;/td&gt;&lt;td&gt;interface&lt;/td&gt;&lt;td&gt;public&lt;/td&gt;&lt;td&gt;this&lt;/td&gt;&lt;td&gt;while&lt;/td&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; FONT-FAMILY: Courier"&gt;&lt;td&gt;byte&lt;/td&gt;&lt;td&gt;do&lt;/td&gt;&lt;td&gt;for&lt;/td&gt;&lt;td&gt;long&lt;/td&gt;&lt;td&gt;return&lt;/td&gt;&lt;td&gt;throw&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; FONT-FAMILY: Courier"&gt;&lt;td&gt;case&lt;/td&gt;&lt;td&gt;double&lt;/td&gt;&lt;td&gt;goto&lt;/td&gt;&lt;td&gt;native&lt;/td&gt;&lt;td&gt;short&lt;/td&gt;&lt;td&gt;throws&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; FONT-FAMILY: Courier"&gt;&lt;td&gt;catch&lt;/td&gt;&lt;td&gt;else&lt;/td&gt;&lt;td&gt;if&lt;/td&gt;&lt;td&gt;new&lt;/td&gt;&lt;td&gt;static&lt;/td&gt;&lt;td&gt;transient&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-WEIGHT: bold; FONT-SIZE: 14pt; BORDER-LEFT: medium none; BORDER-BOTTOM: black 2pt solid; FONT-FAMILY: Courier"&gt;&lt;td&gt;char&lt;/td&gt;&lt;td&gt;extends&lt;/td&gt;&lt;td&gt;implements&lt;/td&gt;&lt;td&gt;null&lt;/td&gt;&lt;td&gt;strictfp&lt;/td&gt;&lt;td&gt;true&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-TOP: black 2pt solid" colspan="7"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/center&gt;&lt;br /&gt;&lt;p&gt;Слова &lt;span class="src"&gt;goto&lt;/span&gt; и &lt;span class="src"&gt;const&lt;/span&gt; являются зарезервированными. Хоть они и не имеют никакого смысла в Java, программисты не могут использовать их как идентификатор.&lt;/p&gt;&lt;p&gt;&lt;i&gt;Идентификатор&lt;/i&gt; - это слово, используемого программистом, чтобы дать имя переменной, методу, классу или метке. Ключевые и зарезервированные слова не могут быть использованы в качестве идентификаторов. Идентификатор может начинаться с буквы, символа подчёркивания (_) или символа доллара ($); последующими символами могут быть буквы, цифры, символы подчёркивания или символы доллара. Несколько примеров:&lt;br /&gt;&lt;span class="src"&gt;&lt;br /&gt;1. foobar // верно&lt;br /&gt;2. BIGinterface // верно, хоть и со встроенным ключевым словом&lt;br /&gt;3. // OK&lt;br /&gt;4. $incomeAfterExpenses // верно&lt;br /&gt;5. 3_node5 // неверно: начинается с цифры&lt;br /&gt;6. !theCase // неверно: должно начинаться с буквы, $, или _&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Идентификаторы чувствительны к регистру. Например, &lt;span class="src"&gt;Radius&lt;/span&gt; и &lt;span class="src"&gt;radius&lt;/span&gt; - различные идентификаторы.&lt;/p&gt;&lt;h3&gt;1.3. Примитивные типы данных&lt;/h3&gt;&lt;p&gt;&lt;span class="lyric"&gt;&lt;span style="color:#000099;"&gt;&lt;u&gt;Лирическое отступление для совсем новичков&lt;/u&gt; &lt;/span&gt;&lt;p&gt;&lt;span style="color:#000099;"&gt;Типы данных описывают формат, в котором данные хранятся в памяти компьютера. Например: целые и дробные числа, целая строка и отдельный символ, - представляются по-разному. Комплексные типы данных состоят из примитивных. Например, список строк состоит из строки и указателя (целое число) на следующую в списке строку.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Примитивные типы данных в Java: &lt;span class="src"&gt;boolen&lt;/span&gt;, &lt;span class="src"&gt;char&lt;/span&gt;, &lt;span class="src"&gt;byte&lt;/span&gt;, &lt;span class="src"&gt;short&lt;/span&gt;, &lt;span class="src"&gt;int&lt;/span&gt;, &lt;span class="src"&gt;long&lt;/span&gt;, &lt;span class="src"&gt;float&lt;/span&gt;, &lt;span class="src"&gt;double&lt;/span&gt;. Размеры этих типов приведены в Таблице 1.2.&lt;br /&gt;&lt;table width="1000"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: black 2pt solid" colspan="4"&gt;&lt;p&gt;Таблица 1.2: Примитивные&lt;br /&gt;типы данных и их размер&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: Arial"&gt;&lt;td style="MARGIN-LEFT: 5pt; MARGIN-RIGHT: 5pt"&gt;Тип&lt;/td&gt;&lt;td&gt;Размер (в битах)&lt;/td&gt;&lt;td&gt;Тип&lt;/th&gt; &lt;td&gt;Размер (в битах)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-SIZE: 1pt; BORDER-LEFT: medium none; BORDER-BOTTOM: black 1pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;boolean&lt;/td&gt;&lt;td&gt;1&lt;/td&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;char&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;byte&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;short&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;int&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;long&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;float&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;double&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-TOP: black 2pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Переменные типа &lt;span class="src"&gt;boolean&lt;/span&gt; принимают только два значения: &lt;span class="src"&gt;true&lt;/span&gt; и &lt;span class="src"&gt;false&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Четыре целочисленных типа со знаком: &lt;span class="src"&gt;byte&lt;/span&gt;, &lt;span class="src"&gt;short&lt;/span&gt;, &lt;span class="src"&gt;int&lt;/span&gt;, &lt;span class="src"&gt;long&lt;/span&gt;. Их интервалы значений приведены в Таблице 1.3.&lt;br /&gt;&lt;table width="1000"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: black 2pt solid" colspan="4"&gt;&lt;p&gt;Таблица 1.3: Интервалы значений целочисленных типов со знаком&lt;/p&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; FONT-FAMILY: Arial"&gt;&lt;td style="MARGIN-LEFT: 5pt; MARGIN-RIGHT: 5pt"&gt;Тип&lt;/td&gt;&lt;td&gt;Размер (в битах)&lt;/td&gt;&lt;td&gt;Минимум&lt;/th&gt; &lt;td&gt;Максимум&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; FONT-SIZE: 1pt; BORDER-LEFT: medium none; BORDER-BOTTOM: black 1pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;byte&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;-2&lt;sup&gt;7&lt;/sup&gt;&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;7&lt;/sup&gt;-1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;short&lt;/td&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;-2&lt;sup&gt;15&lt;/sup&gt;&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;15&lt;/sup&gt;-1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;int&lt;/td&gt;&lt;td&gt;32&lt;/td&gt;&lt;td&gt;-2&lt;sup&gt;31&lt;/sup&gt;&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;31&lt;/sup&gt;-1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="FONT-WEIGHT: bold; FONT-SIZE: 14pt; FONT-FAMILY: Courier"&gt;long&lt;/td&gt;&lt;td&gt;64&lt;/td&gt;&lt;td&gt;-2&lt;sup&gt;63&lt;/sup&gt;&lt;/td&gt;&lt;td&gt;2&lt;sup&gt;63&lt;/sup&gt;-1&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="BORDER-TOP: black 2pt solid" colspan="4"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Тип &lt;span class="src"&gt;char&lt;/span&gt; - целочисленный, но без знака. Его диапазон варьируется от 1 до 2^16-2. Java символы (&lt;span class="src"&gt;char&lt;/span&gt; тип) кодируются в системе Unicode, то есть 16-тибитное представление значительной части символов, используемых в различных письменных системах. Если 9 первых значащих битов установлены в 0, то кодировка остальной части символа совпадает с кодировкой 7-битной&lt;br /&gt;системы ASCII.&lt;/p&gt;&lt;p&gt;Типы с плавающей десятичной запятой: &lt;span class="src"&gt;float&lt;/span&gt; и &lt;span class="src"&gt;double&lt;/span&gt;. Они соответсвуют спецификации IEEE 754. Некоторые математические оперции приводят к значению, не имеющему представления в цифрах (например, бесконечность). Для описания таких нецифровых ситуаций и &lt;span class="src"&gt;float&lt;/span&gt; и &lt;span class="src"&gt;double&lt;/span&gt; могут представляться специальными битовыми паттернами, которые не соответствуют числам. Эти паттерны определены в классах &lt;span class="src"&gt;Float&lt;/span&gt; и &lt;span class="src"&gt;Double&lt;/span&gt; и обращение к ним происходит следующим образом (здесь и далее &lt;span class="src"&gt;NaN&lt;/span&gt; означает &lt;i&gt;Not a Number&lt;/i&gt;, не число):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="src"&gt;Float.NaN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;Float.NEGATIVE_INFINITY&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;Float.POSITIVE_INFINITY&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;Double.NaN&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;Double.NEGATIVE_INFINITY&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="src"&gt;Double.POSITIVE_INFINITY&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Следующий фрагмент кода показывает пример использования этих паттернов:&lt;span class="src"&gt;&lt;br /&gt;1. double d = -10.0 / 0.0;&lt;br /&gt;2. if (d == Double.NEGATIVE_INFINITY) {&lt;br /&gt;3. System.out.println("d только что ушёл в бесконечность: " + d);&lt;br /&gt;4. }&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="remember"&gt;&lt;span style="color:#cc0000;"&gt;&lt;u&gt;Запомним!&lt;/u&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="remember"&gt;&lt;br /&gt;&lt;span style="color:#cc0000;"&gt;Все численные примитивные типы (то есть кроме &lt;span class="src"&gt;boolean&lt;/span&gt; и &lt;span class="src"&gt;char&lt;/span&gt;) - со знаком.&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#cc0000;"&gt; &lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8592713917061554150-3234594062834754070?l=javapd.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://javapd.blogspot.com/feeds/3234594062834754070/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=8592713917061554150&amp;postID=3234594062834754070' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/3234594062834754070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8592713917061554150/posts/default/3234594062834754070'/><link rel='alternate' type='text/html' href='http://javapd.blogspot.com/2008/04/java-1.html' title='Основы языка Java (Выпуск 1)'/><author><name>Natalia Macheda</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='29' height='32' src='http://bp0.blogger.com/_R9aklLcmKBs/SFj3PiTcjHI/AAAAAAAAAAQ/x5BXCgNwx0c/S220/getImage.jpg'/></author><thr:total>4</thr:total></entry></feed>
