Spec-Zone .ru
спецификации, руководства, описания, API
|
ГЛАВА 4
Java является языком со строгим контролем типов, что означает, что у каждой переменной и каждого выражения есть тип, который известен во время компиляции. Типы ограничивают значения, которые может содержать переменная (§4.5) или что выражение может произвести, ограничить операции, поддерживаемые на тех значениях, и определить значение операций. Строгий контроль типов помогает обнаружить ошибки во время компиляции.
Типы языка Java делятся на две категории: типы примитивов и ссылочные типы. Типы примитивов (§4.2) boolean
введите и числовые типы. Числовые типы являются целочисленными типами byte
, short
, int
, long
, и char
, и типы с плавающей точкой float
и double
. Ссылочные типы (§4.3) являются типами классов, интерфейсными типами, и выстраивают типы. Есть также специальный нулевой тип. Объект (§4.3.1) в Java является динамически создаваемым экземпляром типа класса или динамически создаваемым массивом. Значения ссылочного типа являются ссылками на объекты. Все объекты, включая массивы, поддерживают методы класса Object
(§4.3.2). Строковые литералы представляются String
объекты (§4.3.3).
Типы - тот же самый (§4.3.4), если они имеют те же самые полностью определенные имена и загружаются тем же самым загрузчиком класса. Имена типов используются (§4.4) в объявлениях, в бросках, в выражениях создания экземпляра класса, в выражениях создания массива, и в instanceof
выражения оператора.
Переменная (§4.5) является местом хранения. Переменная типа примитива всегда содержит значение того точного типа. Переменная типа класса T может содержать нулевую ссылку или ссылку на экземпляр класса T или любого класса, который является подклассом T. Переменная интерфейсного типа может содержать нулевую ссылку или ссылку на любой экземпляр любого класса, который реализует интерфейс. Если T является типом примитива, то переменная типа "массив T" может содержать нулевую ссылку или ссылку на любой массив типа "массив T"; если T является ссылочным типом, то переменная типа "массив T" может содержать нулевую ссылку или ссылку на любой массив типа "массив S" так, что, тип S присваиваем (§5.2) типу T. Переменная типа Object
может содержать нулевую ссылку или ссылку на любой объект, ли экземпляр класса или массив.
Type:Есть также специальный нулевой тип, тип выражения
PrimitiveType
ReferenceType
null
, у которого нет никакого имени. Поскольку у нулевого типа нет никакого имени, невозможно объявить переменную нулевого типа или бросить к нулевому типу. Нулевая ссылка является единственным возможным значением выражения нулевого типа. Нулевая ссылка может всегда бросаться к любому ссылочному типу. Практически, программист Java может проигнорировать нулевой тип и только симулировать это null
просто специальный литерал, который может иметь любой ссылочный тип.PrimitiveType:Примитивные значения не совместно используют состояние с другими примитивными значениями. Переменная, тип которой является типом примитива всегда, содержит примитивное значение того же самого типа. Значение переменной типа примитива может быть изменено только операциями присвоения на той переменной.
NumericType
boolean
NumericType:
IntegralType
FloatingPointType IntegralType: one of
byte short int long char
FloatingPointType: one of
float double
Числовые типы являются целочисленными типами и типами с плавающей точкой.
Целочисленные типы byte
, short
, int
, и long
, чьи значения являются 8-разрядными, 16-разрядными, 32-разрядными и 64-разрядными two's-дополнительными целыми числами со знаком, соответственно, и char
, чьи значения являются 16-разрядными целыми без знака, представляющими символы Unicode.
Типы с плавающей точкой float
, чьи значения являются 32-разрядным IEEE 754 числа с плавающей точкой, и double
, чьи значения являются 64-разрядным IEEE 754 числа с плавающей точкой.
boolean
у типа есть точно два значения: true
и false.
byte
, от-128 до 127, включительно
short
, от-32768 до 32767, включительно
int
, от-2147483648 до 2147483647, включительно
long
, от-9223372036854775808 до 9223372036854775807, включительно
char
, от '\u0000'
к '\uffff'
включительно, то есть, от 0 до 65535 boolean
: <
, <=
, >
, и >=
(§15.19.1)
==
и !=
(§15.20.1)
int
или long
: +
и -
(§15.14.3, §15.14.4)
*
, /
, и %
(§15.16)
+
и -
(§15.17.2)
++
, и префикс (§15.14.1) и постфикс (§15.13.2)
--
, и префикс (§15.14.2) и постфикс (§15.13.3)
<<
, >>
, и >>>
(§15.18)
~
(§15.14.5)
&
, |
, и ^
(§15.21.1)
? :
(§15.24)
+
(§15.17.1), который, когда дано a String
операнд и интегральный операнд, преобразует интегральный операнд в a String
представление его значения в десятичной форме, и затем производит недавно создаваемый String
это - связь двух строк Integer
(§20.7), Long
(§20.8), и Character
(§20.5). Если у целочисленного оператора кроме оператора сдвига есть по крайней мере один операнд типа long
, тогда работа выполняется, используя 64-разрядную точность, и результат числового оператора имеет тип long
. Если другой операнд не long
, это сначала расширяется (§5.1.2), чтобы ввести long
числовым продвижением (§5.6). Иначе, работа выполняется, используя 32-разрядную точность, и результат числового оператора имеет тип int
. Если любой операнд не int
, это сначала расширяется до типа int
числовым продвижением.
Встроенные целочисленные операторы не указывают на переполнение или потерю значимости всегда. Единственные числовые операторы, которые могут выдать исключение (§11), являются целочисленным оператором дележа /
(§15.16.2) и целочисленный оператор остатка %
(§15.16.3), которые бросают ArithmeticException
если правый операнд является нулем.
class Test { public static void main(String[] args) { int i = 1000000; System.out.println(i * i); long l = i; System.out.println(l * l); System.out.println(20296 / (l - i)); } }производит вывод:
-727379968 1000000000000и затем встречается
ArithmeticException
в подразделении l
-
i
, потому что l
-
i
нуль. Первое умножение выполняется в 32-разрядной точности, тогда как второе умножение является a long
умножение. Значение -727379968
десятичное значение низких 32 битов математического результата, 1000000000000
, который является значением, слишком большим для типа int
. Любое значение любого целочисленного типа может быть брошено к или от любого числового типа. Нет никаких бросков между целочисленными типами и типом boolean
.
float
и double
, представление 32-разрядной одинарной точности и двойная точность 64-разрядные значения формата IEEE 754 и операции как определено в Стандарте IEEE для Двоичной Арифметики С плавающей точкой, Стандарт ANSI/IEEE 754-1985 (IEEE, Нью-Йорк). Стандарт IEEE 754 включает не только положительный и числа величины знака минус, но также и положительные и отрицательные нули, положительные и отрицательные бесконечности, и специальное Не-число (после этого сокращал НЭН). Значение НЭН используется, чтобы представить результат определенных операций, таких как делящийся нуль нулем. Константы НЭН обоих float
и double
тип предопределяется как Float.NaN
(§20.9.5) и Double.NaN
(§20.10.5).
Конечные ненулевые значения типа float
имеют форму, где s +1 или-1, м. является положительным целым числом меньше чем, и e является целым числом между-149 и 104, включительно. Значения той формы так, что м. положителен, но меньше чем, и e равен-149, как, говорят, денормализовываются.
Конечные ненулевые значения типа double
имеют форму, где s +1 или-1, м. является положительным целым числом меньше чем, и e является целым числом между-1075 и 970, включительно. Значения той формы так, что м. положителен, но меньше чем, и e равен-1075, как, говорят, денормализовываются.
За исключением НЭН, упорядочиваются значения с плавающей точкой; расположенный от самого маленького до самого большого, они - отрицательная бесконечность, отрицательные конечные ненулевые значения, отрицательный нуль, положительный нуль, положительные конечные ненулевые значения, и положительная бесконечность.
Положительный нулевой и отрицательный нуль сравнивается равный; таким образом результат выражения 0.0==-0.0
true
и результат 0.0>-0.0
false
. Но другие операции могут отличить положительный и отрицательный нуль; например, 1.0/0.0
имеет значение положительная бесконечность, в то время как значение 1.0/-0.0
отрицательная бесконечность. Операции Math.min
и Math.max
также отличите положительный нулевой и отрицательный нуль.
НЭН неупорядочивают, таким образом, числовые операторы сравнения <
, <=
, >
, и >=
возвратиться false
если или или оба операнда НЭН (§15.19.1). Оператор равенства ==
возвраты false
если любым операндом является НЭН, и оператор неравенства !=
возвраты true
если любым операндом является НЭН (§15.20.1). В частности x!=x
true
если и только если x
НЭН, и (x<y)
==
!(x>=y)
будет false
если x
или y
НЭН.
Любое значение типа с плавающей точкой может быть брошено к или от любого числового типа. Нет никаких бросков между типами с плавающей точкой и типом boolean
.
boolean
: <
, <=
, >
, и >=
(§15.19.1)
==
и !=
(§15.20.1)
float
или double
: +
и -
(§15.14.3, §15.14.4)
*
, /
, и %
(§15.16)
+
и -
(§15.17.2)
++
, и префикс (§15.14.1) и постфикс (§15.13.2)
--
, и префикс (§15.14.2) и постфикс (§15.13.3)
? :
(§15.24)
+
(§15.17.1), который, когда дано a String
операнд и операнд с плавающей точкой, преобразует операнд с плавающей точкой в a String
представление его значения в десятичной форме (без информационной потери), и затем производит недавно создаваемый String
связывая две строки Float
(§20.9), Double
(§20.10), и Math
(§20.11). Если по крайней мере один из операндов к бинарному оператору имеет тип с плавающей точкой, то работа является работой с плавающей точкой, даже если другой является неотъемлемой частью.
Если по крайней мере один из операндов числовому оператору имеет тип double
, тогда работа выполняется, используя 64-разрядную арифметику с плавающей точкой, и результатом числового оператора является значение типа double
. (Если другой операнд не является a double
, это сначала расширяется до типа double
числовым продвижением (§5.6).) Иначе, работа выполняется, используя 32-разрядную арифметику с плавающей точкой, и результатом числового оператора является значение типа float.
Если другой операнд не является a float
, это сначала расширяется до типа float
числовым продвижением.
Операторы на числах с плавающей точкой ведут себя точно как определено IEEE 754. В частности Java требует поддержки IEEE 754 денормализованные числа с плавающей точкой и постепенная потеря значимости, которые облегчают доказывать требуемые свойства определенных числовых алгоритмов. Операции с плавающей точкой в Java "не сбрасывают, чтобы обнулить", если расчетным результатом является денормализованное число.
Java требует, чтобы арифметика с плавающей точкой вела себя как будто каждый оператор с плавающей точкой, округленный ее результат с плавающей точкой к точности результата. Неточные результаты должны быть округлены к представимому значению, самому близкому к бесконечно точному результату; если два самых близких представимых значения одинаково рядом, тот с его младшим значащим разрядным нулем выбирается. Это - значение по умолчанию стандарта IEEE 754 округление режима, известного как вокруг самому близкому.
Java использует вокруг к нулю, преобразовывая плавающее значение в целое число (§5.1.3), который действует, в этом случае, как если бы число было усеченным, отбрасывая биты мантиссы. Округление к нулю выбирает в его результате значение формата, самое близкое к и не больше в величине чем бесконечно точный результат.
Java операторы с плавающей точкой не производит исключений (§11). Работа, которая переполнения производят бесконечность со знаком, работа, которая потери значимости производят нуль со знаком, и работа, у которой нет никакого математически определенного результата, производит НЭН. Все числовые операции с НЭН как операнд производят НЭН в результате. Как был уже описан, НЭН неупорядочивают, таким образом, числовая работа сравнения, включающая один или два возврата NaNs false
и любой !=
сравнение, включающее возвраты НЭН true
, включая x!=x
когда x
НЭН.
class Test { public static void main(String[] args) { // An example of overflow: double d = 1e308; System.out.print("overflow produces infinity: "); System.out.println(d + "*10==" + d*10); // An example of gradual underflow: d = 1e-305 * Math.PI; System.out.print("gradual underflow: " + d + "\n "); for (int i = 0; i < 4; i++) System.out.print(" " + (d /= 100000)); System.out.println(); // An example of NaN: System.out.print("0.0/0.0 is Not-a-Number: "); d = 0.0/0.0; System.out.println(d); // An example of inexact results and rounding: System.out.print("inexact results with float:"); for (int i = 0; i < 100; i++) { float z = 1.0f / i; if (z * i != 1.0f) System.out.print(" " + i); } System.out.println(); // Another example of inexact results and rounding: System.out.print("inexact results with double:"); for (int i = 0; i < 100; i++) { double z = 1.0 / i; if (z * i != 1.0) System.out.print(" " + i); } System.out.println(); // An example of cast to integer rounding: System.out.print("cast to int rounds toward 0: "); d = 12345.6; System.out.println((int)d + " " + (int)(-d)); } }производит вывод:
overflow produces infinity: 1.0e+308*10==Infinity gradual underflow: 3.141592653589793E-305 3.1415926535898E-310 3.141592653E-315 3.142E-320 0.0 0.0/0.0 is Not-a-Number: NaN inexact results with float: 0 41 47 55 61 82 83 94 97 inexact results with double: 0 49 98 cast to int rounds toward 0: 12345 -12345Этот пример демонстрирует, между прочим, что постепенная потеря значимости может привести к постепенной потере точности.
Неточные результаты, когда i
0
включите подразделение нулем, так, чтобы z
становится положительной бесконечностью, и z
*
0
НЭН, которая не равна 1.0
.
boolean
Введите и boolean
Значенияboolean
тип представляет логическое количество с двумя возможными значениями, обозначенными литералами true
и false
(§3.10.3). Булевы операторы: ==
и !=
(§15.20.2)
!
(§15.14.6)
&
, ^
, и |
(§15.21.2)
&&
(§15.22) и ||
(§15.23)
? :
(§15.24)
+
(§15.17.1), который, когда дано a String
операнд и булев операнд, преобразует булев операнд в a String
(также "true"
или "false"
), и затем произведите недавно создаваемый String
это - связь двух строк boolean
выражение также определяет, какое подвыражение оценивается в условном выражении ? :
оператор (§15.24). Только boolean
выражения могут использоваться в операторах управления и как первый операнд условного оператора ? :
. Целое число x
может быть преобразован в a boolean
, после соглашения языка C, которое любое ненулевое значение true
, по выражению x!=0
. Ссылка на объект obj
может быть преобразован в a boolean
, после соглашения языка C, что любая ссылка кроме null
true
, по выражению obj!=null
.
Бросок a boolean
оцените типу boolean
позволяется (§5.1.1); никто другой не набирает тип boolean
позволяются. A boolean
может быть преобразован в строку преобразованием строк (§5.4).
ReferenceType:Имена описываются в §6; имена типов в §6.5 и, определенно, §6.5.4.
ClassOrInterfaceType
ArrayType ClassOrInterfaceType:
ClassType
InterfaceType ClassType:
TypeName InterfaceType:
TypeName ArrayType:
Type[ ]
объявляет тип класса
class Point { int[] metrics; }
interface Move { void move(int deltax, int deltay); }
Point
, интерфейсный тип Move
, и использует тип массива int[]
(массив int
) объявить поле metrics
из класса Point
. Ссылочные значения (часто только ссылки) являются указателями на эти объекты, и специальной нулевой ссылкой, которая не обращается ни к какому объекту.
Экземпляр класса явно создается выражением создания экземпляра класса (§15.8), или вызывая newInstance
метод класса Class
(§20.3.8). Массив явно создается выражением создания массива (§15.8).
Новый экземпляр класса неявно создается, когда оператор конкатенации строк + (§15.17.1) используется в выражении, приводящем к новому объекту типа String
(§4.3.3, §20.12). Новый объект массива неявно создается, когда выражение инициализатора массива (§10.6) оценивается; это может произойти, когда класс или интерфейс инициализируются (§12.4), когда новый экземпляр класса создается (§15.8), или когда оператор объявления локальной переменной выполняется (§14.3).
Многие из этих случаев иллюстрируются в следующем примере:
class Point { int x, y; Point() { System.out.println("default"); } Point(int x, int y) { this.x = x; this.y = y; } // A Point instance is explicitly created at class initialization time: static Point origin = new Point(0,0); // A String can be implicitly created by a + operator: public String toString() {который производит вывод:
return "(" + x + "," + y + ")";
} }
class Test { public static void main(String[] args) { // A Point is explicitly created using newInstance: Point p = null; try { p = (Point)Class.forName("Point").newInstance(); } catch (Exception e) { System.out.println(e); }
// An array is implicitly created by an array constructor: Point a[] = { new Point(0,0), new Point(1,1) };
// Strings are implicitly created by + operators: System.out.println("p: " + p); System.out.println("a: { " + a[0] + ", "
+ a[1] + " }");
// An array is explicitly created by an array creation expression: String sa[] = new String[2]; sa[0] = "he"; sa[1] = "llo"; System.out.println(sa[0] + sa[1]); } }
default p: (0,0) a: { (0,0), (1,1) } helloОператоры на ссылках на объекты:
+
(§15.17.1), который, когда дано a String
операнд и ссылка, преобразует ссылку на a String
вызывая toString
метод (§20.1.2) объекта, на который ссылаются (использование "null"
если или ссылка или результат toString
нулевая ссылка), и затем произведет недавно создаваемый String
это - связь двух строк
instanceof
оператор (§15.19.2)
==
и !=
(§15.20.3)
? :
(§15.24).
class Value { int val; }
class Test { public static void main(String[] args) { int i1 = 3; int i2 = i1; i2 = 4; System.out.print("i1==" + i1); System.out.println(" but i2==" + i2); Value v1 = new Value(); v1.val = 5; Value v2 = v1; v2.val = 6; System.out.print("v1.val==" + v1.val); System.out.println(" and v2.val==" + v2.val); } }производит вывод:
i1==3 but i2==4 v1.val==6 and v2.val==6потому что
v1.val
и v2.val
сошлитесь на ту же самую переменную экземпляра (§4.5.3) в том Value
объект создается единственным new
выражение, в то время как i1
и i2
различные переменные. См. §10 и §15.9 для примеров создания и использования массивов.
У каждого объекта есть связанная блокировка (§17.13), который используется synchronized
методы (§8.4.3) и synchronized
оператор (§14.17), чтобы обеспечить управление параллельным доступом, чтобы утвердить многократными потоками (§17.12, §20.20).
Object
Object
суперкласс (§8.1) всех других классов. Переменная типа Object
может содержать ссылку на любой объект, является ли это экземпляром класса или массива (§10). Весь класс и типы массива наследовали методы класса Object
, которые получаются в итоге здесь и полностью определяются в §20.1: package java.lang;
public class Object { public final Class getClass() { . . . } public String toString() { . . . } public boolean equals(Object obj) { . . . } public int hashCode() { . . . } protected Object clone() throws CloneNotSupportedException { . . . } public final void wait()Элементы
throws IllegalMonitorStateException,
InterruptedException { . . . } public final void wait(long millis) throws IllegalMonitorStateException, InterruptedException { . . . } public final void wait(long millis, int nanos) { . . . } throws IllegalMonitorStateException, InterruptedException { . . . } public final void notify() { . . . } throws IllegalMonitorStateException public final void notifyAll() { . . . } throws IllegalMonitorStateException protected void finalize() throws Throwable { . . . } }
Object
следующие: getClass
возвраты Class
объект (§20.3), который представляет класс объекта. A Class
объект существует для каждого ссылочного типа. Это может использоваться, например, чтобы обнаружить полностью определенное имя класса, его элементов, его непосредственного суперкласса, и любых интерфейсов, которые это реализует. Метод класса, который объявляется synchronized
(§8.4.3.5) синхронизируется на блокировке, связанной с Class
объект класса.
toString
возвраты a String
представление объекта.
equals
и hashCode
объявляются в пользу хеш-таблиц таким как java.util.Hashtable
(§21.7). Метод equals
определяет понятие объектного равенства, которое основано на значении, не ссылке, сравнении.
clone
используется, чтобы сделать копию объекта.
wait
, notify
, и notifyAll
используются в параллельном программировании, используя потоки, как описано в §17.
finalize
выполняется непосредственно перед тем, как объект уничтожается и описывается в §12.6. String
String
(§20.12) представляют последовательности символов Unicode. A String
у объекта есть постоянное (неизменное) значение. Строковые литералы (§3.10.5) являются ссылками на экземпляры класса String
. Оператор конкатенации строк +
(§15.17.1) неявно создает новое String
объект.
Следующий фрагмент кода содержит один или более экземпляров каждого вида использования типа:
import java.util.Random;
class MiscMath {В этом примере типы используются в объявлениях следующего:
int divisor;
MiscMath(int divisor) { this.divisor = divisor; }
float ratio(long l) { try { l /= divisor; } catch (Exception e) { if (e instanceof ArithmeticException) l = Long.MAX_VALUE; else l = 0; } return (float)l; }
double gausser() { Random r = new Random(); double[] val = new double[2]; val[0] = r.nextGaussian(); val[1] = r.nextGaussian(); return (val[0] + val[1]) / 2; }
}
Random
, импортированный из типа java.util.Random
из пакета java.util
, объявляется
divisor
в классе MiscMath
как объявляют, имеет тип int
l
из метода ratio
как объявляют, имеет тип long
ratio
как объявляют, имеет тип float
, и результат метода gausser
как объявляют, имеет тип double
MiscMath
как объявляют, имеет тип int
r
и val
из метода gausser
как объявляют, имеют типы Random
и double[]
(массив double
)
e
из catch
пункт, как объявляют, имеет тип Exception
r
из метода gausser
инициализируется выражением создания экземпляра класса, которое использует тип Random
val
из метода gausser
инициализируется выражением создания массива, которое создает массив double
с размером 2
return
оператор метода ratio
использование float
введите бросок
instanceof
оператор (§15.19.2); здесь instanceof
оператор тестирует ли e
присвоение, совместимое с типом ArithmeticException
++
(инкремент) или --
(декрементный) оператор (§15.13.2, §15.13.3, §15.14.1, §15.14.2). Совместимость значения переменной с ее типом гарантируется проектом языка Java. Значения по умолчанию являются совместимыми (§4.5.4), и все присвоения на переменную проверяются на совместимость присвоения (§5.2), обычно во время компиляции, но, в единственных массивах включения случая, проверка на этапе выполнения делается (§10.10).
static
в пределах объявления класса (§8.3.1.1), или с или без ключевого слова static
в пределах интерфейсного объявления (§9.3). Переменная класса создается, когда ее класс или интерфейс загружаются (§12.2) и инициализируются к значению по умолчанию (§4.5.4). Переменная класса эффективно прекращает существование, когда ее класс или интерфейс разгружаются (§12.8), после того, как любое необходимое завершение класса или интерфейса (§12.6) был завершен.
static
(§8.3.1.1). Если класс T
имеет поле a, которое является переменной экземпляра, затем новая переменная экземпляра создаваемого и инициализированного к значению по умолчанию (§4.5.4) как часть каждого недавно создаваемого объекта класса T
или любого класса, который является подклассом T
(§8.1.3). Переменная экземпляра эффективно прекращает существование, когда, объектом которого это - поле, больше не ссылается, после любого необходимого завершения объекта был завершен (§12.6).
catch
пункт a try
оператор (§14.18). Новая переменная инициализируется с фактическим объектом, связанным с исключением (§11.3, §14.16). Параметр обработчика исключений эффективно прекращает существование когда выполнение блока, связанного с catch
пункт полон.
for
оператор (§14.12), новая переменная создается для каждой локальной переменной, объявленной в операторе объявления локальной переменной, сразу содержавшем в пределах того блока или for
оператор. Оператор объявления локальной переменной может содержать выражение, которое инициализирует переменную. Локальная переменная с выражением инициализации не инициализируется, однако, до оператора объявления локальной переменной, который объявляет, что это выполняется. (Правила определенного присвоения (§16) препятствуют тому, чтобы значение локальной переменной использовалось прежде, чем это было инициализировано или иначе присвоило значение.) Локальная переменная эффективно прекращает существование когда выполнение блока или for
оператор полон. switch
оператор (§14.9), где для управления возможно ввести блок, но обходное выполнение оператора объявления локальной переменной. Из-за ограничений, введенных правилами определенного присвоения (§16), однако, не может использоваться локальная переменная, объявленная таким обошедшим оператором объявления локальной переменной прежде, чем это было определенно присвоено значение выражением присвоения (§15.25).
class Point { static int numPoints; // numPoints is a class variable int x, y; // x and y are instance variables int[] w = new int[10]; // w[0] is an array component int setX(int x) { // x is a method parameter int oldx = this.x; // oldx is a local variable this.x = x; return oldx; } }
byte
, значение по умолчанию является нулем, то есть, значением (byte)0
.
short
, значение по умолчанию является нулем, то есть, значением (short)0
.
int
, значение по умолчанию является нулем, то есть, 0
.
long
, значение по умолчанию является нулем, то есть, 0L
.
float
, значение по умолчанию является положительным нулем, то есть, 0.0f
.
double
, значение по умолчанию является положительным нулем, то есть, 0.0d
.
char
, значение по умолчанию является нулевым символом, то есть,'\u0000
'.
boolean
, значение по умолчанию false
.
null
. class Point { static int npoints; int x, y; Point root; }печатные издания:
class Test { public static void main(String[] args) { System.out.println("npoints=" + Point.npoints); Point p = new Point(); System.out.println("p.x=" + p.x + ", p.y=" + p.y); System.out.println("p.root=" + p.root); } }
npoints=0 p.x=0, p.y=0 p.root=nullиллюстрирование инициализации по умолчанию
npoints
, который происходит когда класс Point
готовится (§12.3.2), и инициализация по умолчанию x
, y
, и root
, который происходит когда новое Point
инстанцируется. См. §12 для полного описания всех аспектов загрузки, соединения, и инициализации классов и интерфейсов, плюс описание инстанцирования классов, чтобы сделать новые экземпляры класса. newInstance
метод (§20.3.6), чтобы произвести объект, или String
класс для объектов неявно создается оператором конкатенации строк +
(§15.17.1). Этот класс вызывают классом объекта. (У массивов также есть класс, как описано в конце этого раздела.) Объект, как говорят, является экземпляром своего класса и всех суперклассов его класса. (Иногда у переменной или выражения, как говорят, есть "тип времени выполнения", но это - злоупотребление терминологией; это обращается к классу объекта, упомянутого значением переменной или выражения во время выполнения, предполагая, что значение не null
. Должным образом разговор, тип является понятием времени компиляции. У переменной или выражения есть тип; объект или массив не имеют никакого типа, но принадлежат классу.)
Тип переменной всегда объявляется, и тип выражения может быть выведен во время компиляции. Тип ограничивает возможные значения, которые может содержать переменная, или выражение может произвести во время выполнения. Если значение времени выполнения является ссылкой, которая не является null
, это обращается к объекту, или выстройте, у которого есть класс (не тип), и тот класс обязательно будет совместимым с типом времени компиляции.
Даже при том, что у переменной или выражения может быть тип времени компиляции, который является интерфейсным типом, нет никаких экземпляров интерфейсов. Переменная или выражение, тип которого является интерфейсным типом, могут сослаться на любой объект, класс которого реализует (§8.1.4) тот интерфейс.
Вот пример создания новых объектов и различия между типом переменной и классом объекта:
public interface Colorable { void setColor(byte r, byte g, byte b); }В этом примере:
class Point { int x, y; } class ColoredPoint extends Point implements Colorable {
byte r, g, b;
public void setColor(byte rv, byte gv, byte bv) { r = rv; g = gv; b = bv; }
}
class Test { public static void main(String[] args) { Point p = new Point(); ColoredPoint cp = new ColoredPoint(); p = cp; Colorable c = cp; } }
p
из метода main
из класса Test
имеет тип Point
и первоначально присваивается ссылка на новый экземпляр класса Point
.
cp
так же имеет как его тип ColoredPoint
, и первоначально присваивается ссылка на новый экземпляр класса ColoredPoint
.
cp
к переменной p
причины p
содержать ссылку на a ColoredPoint
объект. Это разрешается потому что ColoredPoint
подкласс Point
, так класс ColoredPoint
присвоение, совместимое (§5.2) с типом Point
. A ColoredPoint
объект включает поддержку всех методов a Point
. В дополнение к его определенным полям r
, g
, и b
, у этого есть поля класса Point
, а именно, x
и y
.
c
имеет как его тип интерфейсный тип Colorable
, таким образом, это может содержать ссылку на любой объект, класс которого реализует Colorable
; определенно, это может содержать ссылку на a ColoredPoint
.
new Colorable()
"не допустимо, потому что не возможно создать экземпляр интерфейса, только класса. getClass
(§20.1.1), когда вызвано для объекта массива, возвратит объект класса (класса Class
) это представляет класс массива. У классов для массивов есть странные имена, которые не являются допустимыми идентификаторами Java; например, класс для массива int
у компонентов есть имя"[I
"и так значение выражения:
new int[10].getClass().getName()строка
"[I"
; см. §20.1.1 для деталей.
Содержание | Предыдущий | Следующий | Индекс
Спецификация языка Java (HTML, сгенерированный Блинчиком "сюзет" Pelouch 24 февраля 1998)
Авторское право © Sun Microsystems, Inc 1996 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к doug.kramer@sun.com