<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:gd="http://schemas.google.com/g/2005" xmlns:georss="http://www.georss.org/georss" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-8592713917061554150</atom:id><lastBuildDate>Fri, 13 Sep 2024 02:15:14 +0000</lastBuildDate><category>глава 2</category><category>глава 3</category><category>модификаторы</category><category>операторы</category><category>модификаторы доступа</category><category>глава 1</category><category>основы языка</category><category>тест</category><category>and</category><category>or</category><category>присваивание</category><category>NaN</category><category>abstract</category><category>download</category><category>equals</category><category>final</category><category>garbage collection</category><category>hashCode</category><category>instanceof</category><category>static</category><category>toString</category><category>xor</category><category>арифметические операторы</category><category>вычитание</category><category>деление</category><category>деление по модулю</category><category>конкатенация</category><category>литералы</category><category>массивы</category><category>основы язык</category><category>ответы на тест</category><category>передача параметров</category><category>резюме</category><category>сбощик мусора</category><category>сдвиг</category><category>сложение</category><category>сравнение</category><category>типы данных</category><category>умножение</category><category>условный оператор</category><title>Java</title><description>&lt;small&gt;&lt;p align="left"&gt;&amp;copy 2008 Наталия Македа&lt;br&gt;
Все материалы блога защищены авторским правом. Любая перепечатка или использование материалов этого блога в коммерческих целях возможна лишь с письменного согласия автора. При некоммерческом использовании ссылка на блог обязательна.&lt;/p&gt;&lt;/small&gt;</description><link>http://javapd.blogspot.com/</link><managingEditor>noreply@blogger.com (Natalia Macheda)</managingEditor><generator>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-143571061126234474</guid><pubDate>Sun, 03 Jan 2010 16:19:00 +0000</pubDate><atom:updated>2010-01-03T08:44:55.341-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">static</category><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><title>static (Выпуск 19)</title><description>&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;</description><link>http://javapd.blogspot.com/2010/01/static-19.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-1879380168005072263</guid><pubDate>Tue, 13 Oct 2009 13:47:00 +0000</pubDate><atom:updated>2009-10-13T06:47:00.601-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">abstract</category><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><title>abstract (Выпуск 18)</title><description>&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;</description><link>http://javapd.blogspot.com/2009/10/abstract-18.html</link><author>noreply@blogger.com (Natalia Macheda)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://i245.photobucket.com/albums/gg69/microstocker/java18/th_abstract.jpg" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-5732891092929253311</guid><pubDate>Mon, 12 Oct 2009 13:13:00 +0000</pubDate><atom:updated>2009-10-12T06:35:09.507-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">final</category><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><title>final (Выпуск 18)</title><description>&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;</description><link>http://javapd.blogspot.com/2009/10/final-18.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-8331744932623151506</guid><pubDate>Wed, 15 Apr 2009 10:34:00 +0000</pubDate><atom:updated>2009-04-15T03:46:09.271-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><category domain="http://www.blogger.com/atom/ns#">модификаторы доступа</category><title>Модификаторы доступа: резюме. Другие модификаторы (Выпуск 17)</title><description>&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;</description><link>http://javapd.blogspot.com/2009/04/17_15.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-2140052610637452317</guid><pubDate>Wed, 15 Apr 2009 09:41:00 +0000</pubDate><atom:updated>2009-04-15T03:52:19.761-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><category domain="http://www.blogger.com/atom/ns#">модификаторы доступа</category><title>Подклассы и методы (Выпуск 17)</title><description>&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;</description><link>http://javapd.blogspot.com/2009/04/17.html</link><author>noreply@blogger.com (Natalia Macheda)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://i668.photobucket.com/albums/vv50/microstocker2/java17/th_hierarchy1.gif" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-1301718905143044146</guid><pubDate>Mon, 26 Jan 2009 15:57:00 +0000</pubDate><atom:updated>2009-01-26T08:11:20.197-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><category domain="http://www.blogger.com/atom/ns#">модификаторы доступа</category><title>protected (Выпуск 16)</title><description>&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;</description><link>http://javapd.blogspot.com/2009/01/protected-16.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-6410860867662598820</guid><pubDate>Mon, 26 Jan 2009 15:32:00 +0000</pubDate><atom:updated>2009-01-26T07:56:54.055-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><category domain="http://www.blogger.com/atom/ns#">модификаторы доступа</category><title>Default (Выпуск 16)</title><description>&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;</description><link>http://javapd.blogspot.com/2009/01/default-16.html</link><author>noreply@blogger.com (Natalia Macheda)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://i245.photobucket.com/albums/gg69/microstocker/java16/th_default_java.gif" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-319092794896104521</guid><pubDate>Fri, 09 Jan 2009 09:23:00 +0000</pubDate><atom:updated>2009-01-09T01:32:24.476-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><category domain="http://www.blogger.com/atom/ns#">модификаторы доступа</category><title>private</title><description>&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;</description><link>http://javapd.blogspot.com/2009/01/private.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-3603230710654490560</guid><pubDate>Fri, 09 Jan 2009 09:19:00 +0000</pubDate><atom:updated>2009-01-09T01:21:05.728-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><category domain="http://www.blogger.com/atom/ns#">модификаторы доступа</category><title>public</title><description>&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;</description><link>http://javapd.blogspot.com/2009/01/public.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-7884372505869573870</guid><pubDate>Mon, 24 Nov 2008 11:44:00 +0000</pubDate><atom:updated>2008-11-24T04:00:41.797-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><category domain="http://www.blogger.com/atom/ns#">модификаторы доступа</category><title>3.2 Модификаторы доступа (Выпуск 14)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/11/32.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-97449949443666155</guid><pubDate>Mon, 24 Nov 2008 11:04:00 +0000</pubDate><atom:updated>2008-11-24T04:00:31.082-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 3</category><category domain="http://www.blogger.com/atom/ns#">модификаторы</category><title>Глава 3: Модификаторы (Выпуск 14)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/11/3.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-4010138712894405481</guid><pubDate>Wed, 05 Nov 2008 13:10:00 +0000</pubDate><atom:updated>2010-11-28T03:21:11.682-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">тест</category><title>Ответы на тест по операторам (Выпуск 13)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/11/13.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-3549808676556818879</guid><pubDate>Sun, 12 Oct 2008 22:34:00 +0000</pubDate><atom:updated>2008-10-12T16:04:22.125-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">тест</category><title>Итоги главы 2 и тест по операторам (Выпуск 12)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/10/2-12.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-9058051489948981232</guid><pubDate>Wed, 24 Sep 2008 09:52:00 +0000</pubDate><atom:updated>2008-09-24T03:20:55.567-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">присваивание</category><title>2.9 Оператор присваивания (Выпуск 11)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/09/29-11.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-6113427868928740274</guid><pubDate>Wed, 24 Sep 2008 09:29:00 +0000</pubDate><atom:updated>2008-09-24T02:52:54.371-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">условный оператор</category><title>2.8 Условный оператор ? : (Выпуск 11)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/09/11.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-8486092270308841793</guid><pubDate>Wed, 20 Aug 2008 09:02:00 +0000</pubDate><atom:updated>2010-11-28T03:07:40.901-08:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">and</category><category domain="http://www.blogger.com/atom/ns#">or</category><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><title>2.7 Укороченные (short-circuit) логические операторы (Выпуск 10)</title><description>Укороченные (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;// первый пример
1. int val = (int)(2 * Math.random());
2. boolean test = (val == 0) || (++val == 2);
3. System.out.println(“test = “ + test + “\nval = “ + val);

// второй пример
1. int val = (int)(2 * Math.random());
2. boolean test = (val == 0)|(++val == 2);
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;</description><link>http://javapd.blogspot.com/2008/08/27-short-circuit-10.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-5270013005594863307</guid><pubDate>Sun, 29 Jun 2008 12:53:00 +0000</pubDate><atom:updated>2008-06-29T06:59:03.301-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">download</category><title>Откуда скачать Java (Выпуск 9)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/06/java-9.html</link><author>noreply@blogger.com (Natalia Macheda)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://i245.photobucket.com/albums/gg69/microstocker/java09/th_Java_01.gif" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-7462540537672253556</guid><pubDate>Sun, 29 Jun 2008 10:09:00 +0000</pubDate><atom:updated>2008-06-29T04:23:18.792-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">and</category><category domain="http://www.blogger.com/atom/ns#">or</category><category domain="http://www.blogger.com/atom/ns#">xor</category><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><title>2.6 Поразрядные операторы: &amp;, ^ и | (Выпуск 9)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/06/26-9.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-8681854374497211202</guid><pubDate>Wed, 28 May 2008 18:37:00 +0000</pubDate><atom:updated>2008-05-28T15:12:15.763-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">equals</category><category domain="http://www.blogger.com/atom/ns#">hashCode</category><category domain="http://www.blogger.com/atom/ns#">instanceof</category><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">сравнение</category><title>2.5 Операторы сравнения (Выпуск 8)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/05/25-8.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-2252952421160760779</guid><pubDate>Thu, 15 May 2008 10:39:00 +0000</pubDate><atom:updated>2008-05-16T01:57:10.087-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">сдвиг</category><title>2.4. Операторы сдвига &amp;lt;&amp;lt;, &amp;gt;&amp;gt; и &amp;gt;&amp;gt;&amp;gt;(Выпуск 7)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/05/24-7.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-937130494627749207</guid><pubDate>Sat, 03 May 2008 11:19:00 +0000</pubDate><atom:updated>2008-05-03T10:44:49.057-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">NaN</category><category domain="http://www.blogger.com/atom/ns#">toString</category><category domain="http://www.blogger.com/atom/ns#">вычитание</category><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">конкатенация</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">сложение</category><title>Сложение и вычитание, NaN (Выпуск 6)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/05/nan-6.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-803947271934746132</guid><pubDate>Sun, 27 Apr 2008 21:37:00 +0000</pubDate><atom:updated>2008-05-02T14:10:11.149-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">арифметические операторы</category><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">деление</category><category domain="http://www.blogger.com/atom/ns#">деление по модулю</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">умножение</category><title>2.3 Арифметические операторы: умножение, деление, деление по модулю</title><description>&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;</description><link>http://javapd.blogspot.com/2008/04/23.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-5843602752393616277</guid><pubDate>Sun, 27 Apr 2008 19:56:00 +0000</pubDate><atom:updated>2008-04-27T13:03:36.294-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 2</category><category domain="http://www.blogger.com/atom/ns#">операторы</category><category domain="http://www.blogger.com/atom/ns#">присваивание</category><title>2. Операторы и присваивания (Выпуск 4)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/04/2-4.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-7226283327777690292</guid><pubDate>Sun, 27 Apr 2008 19:53:00 +0000</pubDate><atom:updated>2008-04-27T12:55:59.852-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 1</category><category domain="http://www.blogger.com/atom/ns#">основы языка</category><category domain="http://www.blogger.com/atom/ns#">ответы на тест</category><title>Ответы на тест по основам языка (Выпуск 4)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/04/blog-post.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-8592713917061554150.post-9111045816497831512</guid><pubDate>Sun, 27 Apr 2008 19:46:00 +0000</pubDate><atom:updated>2008-04-27T12:49:24.676-07:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">глава 1</category><category domain="http://www.blogger.com/atom/ns#">основы языка</category><category domain="http://www.blogger.com/atom/ns#">тест</category><title>Тест по основам языка (Выпуск 3)</title><description>&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;</description><link>http://javapd.blogspot.com/2008/04/3_1477.html</link><author>noreply@blogger.com (Natalia Macheda)</author><thr:total>4</thr:total></item></channel></rss>