目次 | 前 | 次 | 索引 | Java言語規定 第2版 |
Javaプログラム言語は,強く型付けされた(strongly typed)言語とする。それは,個々の変数及び個々の式がコンパイル時に既知の型を持つことを意味する。 型は,変数 (4.5) が保持できるか,又は式が生成できる値を制限し,それらの値に対する演算を制限し,演算の意味を決定する。強い型付けは,コンパイル時にエラーを検出するのに役立つ。
Javaプログラム言語の型は,二つのカテゴリ,プリミティブ型及び参照型に分かれる。プリミティブ型 (4.2) は boolean
型及び数値型とする。数値型は整数的な型である byte
,short
,int
,long
,及び char
,並びに浮動小数点型である float
及び double
とする。参照型 (4.3) はクラス型,インタフェース型,及び配列型とする。特別な空型もある。Javaのオブジェクト (4.3.1) は,動的に生成されたクラス型のインスタンス又は動的に生成された配列とする。参照型の値は,オブジェクトへの参照になる。配列を含むすべてのオブジェクトは,クラス Object
(4.3.2) のメソッドを処理できる。 文字列リテラルは,オブジェクト String
(4.3.3) によって表す。
boolean
type and the numeric types. The numeric types are the integral types byte
, short
, int
, long
, and char
, and the floating-point types float
and double
. The reference types (4.3) are class types, interface types, and array types. There is also a special null type. An object (4.3.1) is a dynamically created instance of a class type or a dynamically created array. The values of a reference type are references to objects. All objects, including arrays, support the methods of class Object
(4.3.2). String literals are represented by String
objects (4.3.3).
型の名前は,宣言,キャスト,クラスインスタンス生成式,配列生成式,クラスリテラル,及び instanceof
演算式において使用する(4.4)。
instanceof
operator expressions.
変数 (4.5) は,記憶域の位置とする。プリミティブ型の変数は,常にその同じ型の値を保持する。クラス型T の変数は,空参照又はクラス T 若しくは T の下位クラスである任意のクラスのインスタンスへの参照を保持する。インタフェース型の変数は,空参照又はそのインタフェースを実装する任意のクラスの任意のインスタンスへの参照を保持する。T がプリミティブ型ならば,"T の配列" 型の変数は,空参照又は"T の配列" 型の任意の配列への参照を保持する。つまり,T が参照型ならば,"T の配列" 型変数は,空参照又は型T に代入可能な (5.2) 型S の "S の配列" 型の任意の配列への参照を保持する。型Object
の変数は,空参照又はクラスインスタンス若しくは配列の任意のオブジェクトへの参照を保持する。
Object
can hold a null reference or a reference to any object, whether class instance or array.
Type:
PrimitiveType
ReferenceType
式null
の型である特別な空型(null type)も存在する。それには名前がない。空型には名前がないので,空型の変数を宣言すること又は空型にキャストすることはできない。空型の式が取りうる唯一の値が空参照となる。空参照は,常に任意の参照型にキャストできる。実用上は,Javaプログラマが,空型を無視し,null
を任意の参照型になれる特別なリテラルと見なしてもよい。
null
, which has no name. Because the null type has no name, it is impossible to declare a variable of the null type or to cast to the null type. The null reference is the only possible value of an expression of null type. The null reference can always be cast to any reference type. In practice, the programmer can ignore the null type and just pretend that null
is merely a special literal that can be of any reference type.
PrimitiveType: NumericTypeプリミティブ値は,他のプリミティブ値と状態を共有しない。プリミティブ型の変数は,常にそれと同じ型のプリミティブ値を保持する。プリミティブ型の変数の値は,その変数に対する代入演算でしか変更できない。boolean
NumericType: IntegralType FloatingPointType IntegralType: one ofbyte short int long char
FloatingPointType: one offloat double
数値型(numeric types)は,整数的な型及び浮動小数点型とする。
整数的な型(integral types)は,byte
,short
,int
,及び long
(それぞれ,8ビット,16ビット,32ビット及び64ビットの符号付きの2の補数表現整数),並びに char
(Unicode文字を表す16ビット符号無し整数)とする。
byte
, short
, int
, and long
, whose values are 8-bit, 16-bit, 32-bit and 64-bit signed two's-complement integers, respectively, and char
, whose values are 16-bit unsigned integers representing Unicode characters.
浮動小数点型(floating-point types)は,float
(32ビットIEEE 754浮動小数点数)及びdouble
(64ビットIEEE 754浮動小数点数)とする。
float
, whose values include the 32-bit IEEE 754 floating-point numbers, and double
, whose values include the 64-bit IEEE 754 floating-point numbers.
boolean
型は二つの値,true
(真)又はfalse
(偽)だけをとる。
boolean
type has exactly two values: true
and false.
byte
型は,-128〜127とする。
byte
, from -128 to 127, inclusiveshort
型は,-32768〜32767以下。
short
, from -32768 to 32767, inclusiveint
型は,-2147483648〜2147483647。
int
, from -2147483648 to 2147483647, inclusivelong
型は,-9223372036854775808〜9223372036854775807。
long
, from -9223372036854775808 to 9223372036854775807, inclusivechar
型は,'\u0000'
〜'\uffff'
,すなわち,0〜65535とする。
char
, from '\u0000'
to '\uffff'
inclusive, that is, from 0 to 65535
boolean
の値とする。
boolean
:int
又は型long
の値とする。
int
or long
:+
及び -
(15.15.3,15.15.4)
*
,/
,及び %
(15.17)
+
及び -
(15.18.2)
++
,前置 (15.15.1) 及び後置 15.14.1) の両方
--
,前置 (15.15.2) 及び後置 (15.14.2) の両方
<<
,>>
,及び >>>
(15.19)
~
(15.15.5)
~
(15.15.5)&
,|
,及び ^
(15.22.1)
? :
(15.25)
? :
(15.25)+
(15.18.1)。String
オペランド及び整数的なオペランドを与えた時,整数的なオペランドをその値を表す10進数表記の String
に変換し,次にその二つの String
を連結した新しい文字列を生成する。
+
(15.18.1), which, when given a String
operand and an integral operand, will convert the integral operand to a String
representing its value in decimal form, and then produce a newly created String
that is the concatenation of the two stringsByte
,クラス Short
,クラス Integer
,クラス Long
,及びクラス Character
であらかじめ定義されている。
Byte
, Short
, Integer
, Long
, and Character
.
シフト演算子以外の整数演算子が少なくとも一つの型long
のオペランドをもてば,演算を64ビット精度で実行し,その結果を型long
とする。片方のオペランドがlong
でなければ,最初に数値昇格 (5.6) によって型long
に拡張する (5.1.4)。そうでなければ,演算は32ビット精度で実行し,その数値演算子の結果は型int
とする。どちらかのオペランドがint
でなければ,演算に先立って数値昇格によって型int
に拡張する。
long
, then the operation is carried out using 64-bit precision, and the result of the numerical operator is of type long
. If the other operand is not long
, it is first widened (5.1.4) to type long
by numeric promotion (5.6). Otherwise, the operation is carried out using 32-bit precision, and the result of the numerical operator is of type int
. If either operand is not an int
, it is first widened to type int
by numeric promotion.
組み込みの整数演算子は,どのような形でもオーバフロー又はアンダフローを示さない。例外 (11) を投げることができる数値演算子は整数除算演算子/
(15.17.2) 及び整数剰余演算子 %
(15.17.3) だけとする。これは,右辺オペランドがゼロならば,ArithmeticException
を投げる。
/
(15.17.2) and the integer remainder operator %
(15.17.3), which throw an ArithmeticException
if the right-hand operand is zero. この例は,次の出力を生成する。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
l
-
i
がゼロなので,l
-
i
による除算でArithmeticException
を生じる。最初の乗算は32ビット精度で実行し,2番目の乗算は,long
乗算とする。値-727379968
は,型int
には大き過ぎる値1000000000000
の下位32ビットを符号付き10進数値化したものとなる。
ArithmeticException
in the division by l
-
i
, because l
-
i
is zero. The first multiplication is performed in 32-bit precision, whereas the second multiplication is a long
multiplication. The value -727379968
is the decimal value of the low 32 bits of the mathematical result, 1000000000000
, which is a value too large for type int
.
任意の整数的な型の任意の値は,任意の数値型からキャストしてもよい。整数的な型と型boolean
の間では,キャストはできない。
boolean
.float
及び double
とし,IEEE Standard for Binary Floating-Point Arithmetic,ANSI/IEEE Standard 754-1985 (IEEE,New York)で規定する,単精度32ビット及び倍精度64ビット形式のIEEE 754 の値及び演算を表現する。
float
and double
, which are conceptually associated with the single-precision 32-bit and double-precision 64-bit format IEEE 754 values and operations as specified in IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985 (IEEE, New York).
IEEE 754 規格は,正負の符号及び大きさからなる数だけではなく,正及び負のゼロ,正及び負の無限大(infinities),並びに特別なNot-a-Number値(以後NaNと略す)を含む。NaN値は,ゼロをゼロで割るなどの特別な演算の結果を表すために使用する。float
及びdouble
型のNaN定数はFloat.NaN
及びDouble.NaN
としてあらかじめ定義されている。
float
and double
type are predefined as Float.NaN
and Double.NaN
.
あらゆるJavaプログラム言語の実装は,単精度数値集合(float value set)及び倍精度数値集合(double value set)という二つの浮動小数点値の規定をサポートしなければならない。加えて,実装によっては単精度指数部拡張数値集合(float-extended-exponent value set)及び倍精度指数部拡張数値集合(double-extended-exponent value set)と呼ばれる二つの指数部拡張浮動少数点値集合のうちのどちらか又は両方をサポートしてもよい。場合によっては,これらの指数部拡張数値集合を型float
又はdouble
(5.1.8,15.4) の式の値を表現する標準数値集合の代わりに使用してもよい。
float
or double
(5.1.8, 15.4).任意の浮動小数点数値集合の有限非ゼロ値はすべて形式で表現される。ここで,sは+1又は-1とし,mはより小さい正の整数とし,eはからまでの整数とする。さらにN及びKは浮動小数点数値集合に依存するパラメタとする。値によっては複数の表現形式が存在する。例えば,数値集合の中の値vについてs,m,及び eのためにある値を使用してこの形式で表現され,またmは偶数でeがより小さいならば,mの半分にして,一つだけeを増加させ,同じ値vに対する二つ目の表現を生成することができる。この形式の表現は,であるならば正規化表現(normalized)と呼ばれ,そうでなければ非正規化表現(denormalized)と呼ばれる。数値集合の中の値がと表現できない場合,値は正規化表現がないため非正規化値(denormalized value)と呼ばれる。
パラメタN及びKに対する制約(さらに派生したパラメタEmin及びEmaxに対する)のために2つの必須(floatとdouble)及び2つのオプションの浮動小数点値集合を表 4.1に要約する。
指数部拡張数値集合をサポートする実装では,その指数部拡張数値集合に,実装に依存する定数Kがあり,その値は表 4.1で制約される。さらに,Kの値によりEmin及びEmaxの値が決まる。
表の四つの数値集合は,表に示された範囲の有限非ゼロ値以外に,NaN値,及び,正のゼロ,負のゼロ,正の無限大,並びに負の無限大の四つの値を含む。
表 4.1の中の制約は,単精度数値集合のすべての要素が必然的に単精度指数部拡張数値集合,倍精度数値集合,及び倍精度指数部拡張数値集合の要素となるように設計されていることに注意。同様に倍精度数値集合のすべての要素も必然的に倍精度指数部拡張数値集合の要素となる。指数部拡張数値集合は対応する標準数値集合よりも大きい指数の幅をもつが,精度が上がるわけではない。
単精度数値集合の要素はIEEE 754標準の中で定義されている単精度浮動小数点形式を使用して表現できる値と同じものとする。倍精度数値集合の要素はIEEE 754標準の中で定義されている倍精度浮動小数点形式を使用して表現できる値と同じとする。しかし,ここで定義されている単精度指数部拡張及び倍精度指数部拡張数値集合の要素はIEEE 754単精度拡張及び倍精度拡張形式を使用して表現できる値に対応しないので注意すること。
単精度,単精度指数部拡張,倍精度,及び倍精度指数部拡張数値集合は型ではない。Javaプログラム言語の実装で型float
の値を表現するために単精度数値集合の要素を使用するのは常に正しい。しかし,実装によっては,コードの一部の領域で単精度指数部拡張数値集合の要素を代わりに使用するのが許される。同様に実装の時に型double
の値を表現するために倍精度数値集合を使用するのも常に正しい。しかし,実装によっては,コードの一部の領域で倍精度指数部拡張数値集合の要素を代わりに使用するのが許される場合もある。
float
; however, it may be permissible in certain regions of code for an implementation to use an element of the float-extended-exponent value set instead. Similarly, it is always correct for an implementation to use an element of the double value set to represent a value of type double
; however, it may be permissible in certain regions of code for an implementation to use an element of the double-extended-exponent value set instead.NaNを除いて,浮動小数点値は最小値から最大値に向かって,負の無限大,負の有限非ゼロ値,負のゼロ,正のゼロ,正の有限非ゼロ値,及び正の無限大の順に 順序付けられている(ordered)とする。
IEEE 754では,個々の単精度及び倍精度浮動小数点形式のために複数の異なったNaN値が許されている。新しいNaNが生成される場合,個々のハードウェアアーキテクチャは,NaNのために特定のビットパターンを返却する。プログラマは,例えば,遡及的診断情報を符号化したような,異なるビットパターンを持つNaNも生成できる。
多くの場合,Javaプラットフォームは与えられた型のNaN値を単一の正準値であるかのように扱う(それゆえこの規定は通常,任意のNaNを正準値として参照する)。しかし,1.3版のJavaプラットフォームではプログラマがNaN値の違いを見分けることを可能にするFloat.floatToRawIntBits
及びDouble.doubleToRawLongBits
メソッドを導入した。興味を持った読者は,さらに多くの情報を得るためにFloat
及び Double
クラスのための規定を参照せよ。
Float.floatToRawIntBits
and Double.doubleToRawLongBits
methods. The interested reader is referred to the specifications for the Float
and Double
classes for more information.
正のゼロと負のゼロの比較結果は,等しいとする。したがって,式0.0==-0.0
の結果はtrue
に,0.0>-0.0
の結果はfalse
になる。しかし,その他の演算は,正及び負のゼロを区別する。例えば,1.0/0.0
は正の無限大の値を持つ。一方,1.0/-0.0
の値は負の無限大とする。
0.0==-0.0
is true
and the result of 0.0>-0.0
is false
. But other operations can distinguish positive and negative zero; for example, 1.0/0.0
has the value positive infinity, while the value of 1.0/-0.0
is negative infinity.
NaNは,順序付けしない(unordered)。したがって,数値比較演算子<
,<=
,>
,及び >=
は,オペランドのいずれか又は両方がNaN (15.20.1) のとき false
を返す。どちらかのオペランドがNaN (15.21.1) ならば,等価演算子 ==
は false
を返し,不等演算子 !=
は true
を返す。特に,x
が NaN の場合に限って,x!=x
はtrue
を,x
又は y
がNaNならば,(x<y)
==
!(x>=y)
は false
を返す。
<
, <=
, >
, and >=
return false
if either or both operands are NaN (15.20.1). The equality operator ==
returns false
if either operand is NaN, and the inequality operator !=
returns true
if either operand is NaN (15.21.1). In particular, x!=x
is true
if and only if x
is NaN, and (x<y)
==
!(x>=y)
will be false
if x
or y
is NaN.
浮動小数点型の任意の値は,任意の数値型へキャストしてよい。又は任意の数値型からキャストされてもよい。浮動小数点型と型boolean
との間では,キャストできない。
boolean
.
boolean
の値とする。
boolean
:float
又は型 double
の値とする。
float
or double
:+
及び -
(15.15.3,15.15.4参照)。
*
,/
,及び %
(15.17)。
+
及び -
(15.18.2)。
++
,前置 (15.15.1) 及び後置 (15.14.1) の両方。
--
,前置 (15.15.2) 及び後置 (15.14.2) の両方。
? :
(15.25)
? :
(15.25)+
(15.18.1)。String
オペランド及び浮動小数点オペランドを与えたとき,浮動小数点オペランドを,その値を表す10進表現の文字列に情報の損失無しに変換し,次にそれら二つの文字列を連結した新しいString
を生成する。
+
(15.18.1), which, when given a String
operand and a floating-point operand, will convert the floating-point operand to a String
representing its value in decimal form (without information loss), and then produce a newly created String
by concatenating the two stringsFloat
,Double
及び Math
の中であらかじめ定義されている。
Float
, Double
, and Math
.二項演算子に対するオペランドのうち少なくとも一つが,浮動小数点型ならば,他方が整数的であっても,演算は,浮動小数点演算とする。
数値演算子のオペランドのうち少なくとも一つが,型double
ならば,演算を64ビット精度浮動小数点計算によって実行し,その数値演算子の結果を,型 double
の値にする。(他方のオペランドがdouble
でなければ,演算に先立って,数値昇格 (5.6) によって型double
に拡張する。)そうでなければ,演算は32ビット精度浮動小数点計算によって実行し,その数値演算子の結果は,型float
の値とする。他方のオペランドがfloat
でなければ,演算に先立って,数値昇格によって型float
に拡張する。
double
, then the operation is carried out using 64-bit floating-point arithmetic, and the result of the numerical operator is a value of type double
. (If the other operand is not a double
, it is first widened to type double
by numeric promotion (5.6).) Otherwise, the operation is carried out using 32-bit floating-point arithmetic, and the result of the numerical operator is a value of type float.
If the other operand is not a float
, it is first widened to type float
by numeric promotion.浮動小数点数に対する演算は,(剰余演算子を除いて (15.17.3)),正確にIEEE 754で規定したとおりに振る舞うものとする。特に,Javaプログラム言語は,IEEE 754 の非正規化(denormalized) 浮動小数点数及び 緩やかなアンダフロー(gradual underflow)を扱う必要がある。これらは,数値アルゴリズムの望ましい特性の証明を容易にする。 浮動小数点演算は,計算結果が非正規化数ならば,"ゼロにフラッシュする"ことはない。
Javaプログラム言語は,すべての浮動小数点演算子が,その浮動小数点の結果を,結果精度に丸めたかのように振る舞う計算を必要とする。不正確(inexact)な結果は,正確な結果に限りなく最も近い表現可能値に丸めなければならない。二つの同程度に近い代表値があるときは,もっとも重みのないビット(Least Significant Bit,LSB)がゼロのものが選ばれる。これが,直近への丸め (round to nearest) として知られている,IEEE 754規格のデフォルト丸めモードである。
Javaは,浮動小数点値を整数 (5.1.3) に変換するときに, ゼロに向かう丸め(round toward zero) を適用する。この場合には,仮数ビットを切り捨てるように動作する。ゼロに向かう丸めでは,その形式の値が,大きさに関して正確な値に限りなく最も近くて,しかも大きくない結果を選ぶ。
Javaの浮動小数点演算子は,例外 (11.) を引き起こさない。オーバフローを生じる演算は,符号付き無限大を返し,アンダフローを引き起こす演算は,符号付きゼロを返し,数学的に確定した結果をもたない演算は,NaNを返す。オペランドとしてNaNをもつすべての数値演算は,結果としてNaNを返す。既に述べたとおり,NaNは順序付けしない。したがって,一つ又は二つのNaNを含む数値比較演算はfalse
を返し,NaNを含む !=
比較は true
を返す。これは,x
がNaNであるときのx!=x
を含む。
false
and any !=
comparison involving NaN returns true
, including x!=x
when x
is NaN.この例は,次の出力を生成する。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
はNaNとなる。1.0
に等しくはならない。
i
is 0
involve division by zero, so that z
becomes positive infinity, and z
*
0
is NaN, which is not equal to 1.0
.boolean
型 及び boolean
値
boolean
Type and boolean
Valuesboolean
は,リテラル true
及び false
(3.10.3) で示す二つの可能な値をもつ論理的な量を表す。論理演算子には,次の種類がある。
boolean
type represents a logical quantity with two possible values, indicated by the literals true
and false
(3.10.3). The boolean operators are:
==
及び !=
(15.21.2)
!
(15.15.6)
!
(15.15.6)&
,^
及び |
(15.22.2)
&&
(15.23) 及び ||
(15.24)
? :
(15.25)
? :
(15.25)+
(15.18.1)。String
オペランド及び論理オペランドを与えたとき,論理オペランドを String
("true"
又は "false"
)に変換し,それから,二つの文字列を連結した新しい String
を生成する。
+
(15.18.1),which, when given a String
operand and a boolean operand, will convert the boolean operand to a String
(either "true"
or "false"
), and then produce a newly created String
that is the concatenation of the two strings
if
文 (14.9)
if
statement (14.9)while
文 (14.11)
while
statement (14.11)do
文 (14.12)
do
statement (14.12)for
文 (14.13)
for
statement (14.13)boolean
式はまた,条件演算子 ? :
(15.25) において,どの副式を評価するかを決定する。
boolean
expression also determines which subexpression is evaluated in the conditional ? :
operator (15.25).
boolean
式だけが,条件演算子 ? :
の最初のオペランドとして,及び,制御フロー文内で使用できる。任意の非ゼロ値が true
となるC言語の慣習に従うには,整数 x
を,式 x!=0
によって boolean
に変換する。null
でない任意の参照が true
となるC言語の慣習に従うには,オブジェクト参照 obj
を,式 obj!=null
によって boolean
に変換する。
boolean
expressions can be used in control flow statements and as the first operand of the conditional operator ? :
. An integer x
can be converted to a boolean
, following the C language convention that any nonzero value is true
, by the expression x!=0
. An object reference obj
can be converted to a boolean
, following the C language convention that any reference other than null
is true
, by the expression obj!=null
.
boolean
値の型 boolean
へのキャストは許される (5.1.1)。型 boolean
に関する他のキャストは許されない。boolean
値は,文字列変換 (5.4) によって文字列に変換できる。
boolean
value to type boolean
is allowed (5.1.1); no other casts on type boolean
are allowed. A boolean
can be converted to a string by string conversion (5.4).
ReferenceType:
ClassOrInterfaceType
ArrayType
ClassOrInterfaceType:
ClassType
InterfaceType
ClassType:
TypeName
InterfaceType:
TypeName
ArrayType:
Type [ ]
名前は,6で規定する。型名は,6.5,特に6.5.5で規定する。
この例は,クラス型class Point { int[] metrics; } interface Move { void move(int deltax, int deltay); }
Point
及びインタフェース型 Move
を宣言し,クラス Point
のフィールド metrics
を宣言するために,配列型 int[]
(int
の配列)を使用する。
Point
, an interface type Move
, and uses an array type int[]
(an array of int
) to declare the field metrics
of the class Point
.参照値(しばしば単に 参照(references) と呼ぶ)は,オブジェクトへの ポインタ(pointers) もしくは,いかなるオブジェクトも参照しない特別な空参照となる。
クラスインスタンスは,クラスインスタンス生成式 (15.9) によって明示的に生成される。配列は,配列生成式 (15.9) によって明示的に生成される。
式において文字列連結演算子 + (15.18.1) を使用するときは,新しいクラスインスタンスが暗黙のうちに生成され,結果として型 String
(4.3.3) の新しいオブジェクトとなる。新しい配列オブジェクトは,配列初期化式 (10.6) を評価するときに,暗黙のうちに生成される。これは,クラス又はインタフェースを初期化する (12.4) とき,クラスの新しいインスタンスを生成する (15.9) とき,又は局所変数宣言文を実行する (14.4) ときに発生する。
String
(4.3.3). A new array object is implicitly created when an array initializer expression (10.6) is evaluated; this can occur when a class or interface is initialized (12.4), when a new instance of a class is created (15.9), or when a local variable declaration statement is executed (14.4).この例は,次の出力を生成する。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.18.1)。これは,String
オペランド及び参照を与えたとき,その参照を,参照されたオブジェクトのメソッド toString
を呼び出すことによって,String
に変換する(その参照又は toString
の結果が空参照なら"null"
を使う)。それから,二つの文字列を連結した新しいString
を生成する。
+
(15.18.1), which, when given a String
operand and a reference, will convert the reference to a String
by invoking the toString
method of the referenced object (using "null"
if either the reference or the result of toString
is a null reference), and then will produce a newly created String
that is the concatenation of the two stringsinstanceof
演算子 (15.20.2)
instanceof
operator (15.20.2)==
及び !=
(15.21.3)
? :
(15.25)
? :
(15.25).この例は,次を出力する。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
が new
式だけによって生成された一つのオブジェクト Value
内で同じインスタンス変数 (4.5.3) を参照していることによる。一方,i1
及び i2
は,別々の変数である。
v1.val
and v2.val
reference the same instance variable (4.5.3) in the one Value
object created by the only new
expression, while i1
and i2
are different variables.配列の生成及び使用の例は,10 及び 15.10 を参照すること。
個々のオブジェクトは,対応したロック (17.13) をもつ。これは,多重スレッド (17.12) による状態への同時アクセスを制御するために,synchronized
メソッド (8.4.3) 及びsynchronized
文 (14.18) で使用する。
synchronized
methods (8.4.3) and the synchronized
statement (14.18) to provide control over concurrent access to state by multiple threads (17.12).Object
は,すべての他のクラスの上位クラス (8.1) となる。型 Object
の変数は,それがクラスのインスタンスか,配列 (10) のインスタンスかにかかわらず,任意のオブジェクトへの参照をもつことができる。すべてのクラス及び配列型は,クラス Object
のメソッドを継承する。そのメソッドについて,ここでまとめる。
Object
is a superclass (8.1) of all other classes. A variable of type Object
can hold a reference to any object, whether it is an instance of a class or an array (10). All class and array types inherit the methods of class Object
, which are summarized here:
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
のメンバには,次のものがある。
Object
are as follows:
getClass
は,そのオブジェクトのクラスを表すオブジェクト Class
を返す。オブジェクト Class
は,個々の参照型のために存在する。例えば,それは,クラスの完全限定名,そのメンバ,その直上の上位クラス及びそれが実装するすべてのインタフェース,を見つけるために使用できる。synchronized
(8.4.3.6) と宣言しているクラスメソッドは,そのクラスのオブジェクト Class
と対応したロックを同期化する。
getClass
returns the Class
object that represents the class of the object. A Class
object exists for each reference type. It can be used, for example, to discover the fully qualified name of a class, its members, its immediate superclass, and any interfaces that it implements. A class method that is declared synchronized
(8.4.3.6) synchronizes on the lock associated with the Class
object of the class.toString
は,そのオブジェクトの String
表現を返す。
toString
returns a String
representation of the object.equals
及びメソッド hashCode
は,java.util.Hashtable
などのハッシュ表で大変役立つ。メソッド equals
は,オブジェクト等価の概念を定義する。これは,参照ではなく値の比較に基づく。
equals
and hashCode
are very useful in hashtables such as java.util.Hashtable
. The method equals
defines a notion of object equality, which is based on value, not reference, comparison.clone
は,オブジェクトの複製を作るために使用する。
clone
is used to make a duplicate of an object.wait
,notify
及び notifyAll
は,17.で規定しているとおり,スレッドを使った並行プログラミングで使用する。
wait
, notify
, and notifyAll
are used in concurrent programming using threads, as described in 17.finalize
は,オブジェクトを破壊する直前に実行するものであり,12.6に規定している。
finalize
is run just before an object is destroyed and is described in 12.6.String
のインスタンスは,Unicode 文字の並びを表す。オブジェクト String
は,定数(変更されない)値をもつ。文字列リテラル (3.10.5) は,クラス String
のインスタンスを参照する。
String
represent sequences of Unicode characters. A String
object has a constant (unchanging) value. String literals (3.10.5) are references to instances of class String
.
文字列連結演算子 +
(15.18.1) は,新しいオブジェクト String
を暗黙のうちに生成する。
実行時に,同一バイナリ名をもつ幾つかの参照型は,異なるクラスローダによって同時にロードされるかもしれない。これらの型は同一型宣言を表現するかもしれないし,しないかもしれない。2つの型が同一型宣言を表現していたとしても,それらは異なるものと考えられる。
次の条件を満たすとき,二つの参照型を同一実行時型(same run-time type) とする。
この例では,次の宣言で型が使用される。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; } }
java.util
の型 java.util.Random
からインポートされた型 Random
が宣言される。
Random
, imported from the type java.util.Random
of the package java.util
, is declaredMiscMath
のフィールド divisor
を,型 int
で宣言する。
divisor
in the class MiscMath
is declared to be of type int
ratio
のパラメタ l
を,型 long
で宣言する。
ratio
の結果が型 float
で,メソッド gausser
の結果が型 double
で宣言される。
ratio
is declared to be of type float
, and the result of the method gausser
is declared to be of type double
MiscMath
に対するコンストラクタのパラメタを型 int
で宣言する。
MiscMath
is declared to be of type int
gausser
の局所変数 r
及び val
が,型 Random
及び型 double[]
(double
の配列)で宣言される。
r
and val
of the method gausser
are declared to be of types Random
and double[]
(array of double
)catch
節の例外ハンドラパラメタ e
が型 Exception
で宣言される。
e
of the catch
clause is declared to be of type Exception
gausser
の局所変数 r
が,型 Random
を使ったクラスインスタンス生成式によって初期化される。
r
of method gausser
is initialized by a class instance creation expression that uses the type Random
gausser
の局所変数 val
が,サイズ2の double
の配列を生成する配列生成式によって初期化される。
val
of method gausser
is initialized by an array creation expression that creates an array of double
with size 2ratioreturn
文が,キャストで型 float
を使用する。
instanceof
演算子 (15.20.2)。instanceof
演算子が,e
を型 ArithmeticException
と代入互換かどうか試験する。
instanceof
operator (15.20.2); here the instanceof
operator tests whether e
is assignment compatible with the type ArithmeticException
++
(増分)若しくは--
(減分)演算子 (15.14.1,15.14.2,15.15.1,15.15.2) によって変更される。
++
(increment) or --
(decrement) operator (15.14.1, 15.14.2, 15.15.1, 15.15.2).変数の値とその型との互換性は,Java言語設計が保証する。デフォルト値は互換的 (4.5.5) であって,変数へのすべての代入は,代入互換性 (5.2) を,通常はコンパイル時に検査される。ただし,配列が関係する場合に限り,実行時検査を実行する (10.10)。
static
を使用して宣言したフィールド,又はインタフェース宣言 (9.3) の中でキーワードstaticを使用若しくは使用しないで宣言したフィールドを言う。クラス変数は,そのクラス又はインタフェースを,ロードした (12.3.2) ときに生成され,デフォルト値 (4.5.5) に初期化される。クラス変数は,そのクラス又はインタフェースをアンロードした (12.7) とき,実質的にその存在を終了する。
static
within a class declaration (8.3.1.1), or with or without the keyword static
within an interface declaration (9.3). A class variable is created when its class or interface is prepared (12.3.2) and is initialized to a default value (4.5.5). The class variable effectively ceases to exist when its class or interface is unloaded (12.7).static
(8.3.1.1) を使用しないで宣言したフィールドを言う。クラスT がインスタンス変数フィールドa をもてば,T 又はT (8.1.3) の下位クラスのオブジェクトを新しく生成したとすると,新たなインスタンス変数a がオブジェクトの一部として生成され,デフォルト値 (4.5.5) が,初期値として設定される。インスタンス変数は,それがフィールドとなっているオブジェクトが参照されなくなったとき,そのオブジェクト (12.6) のすべての必要な終了処理を完了した後に,実質的にその存在を終了する。
static
(8.3.1.1). If a class T has a field a that is an instance variable, then a new instance variable a is created and initialized to a default value (4.5.5) as part of each newly created object of class T or of any class that is a subclass of T (8.1.3). The instance variable effectively ceases to exist when the object of which it is a field is no longer referenced, after any necessary finalization of the object (12.6) has been completed.try
文 (14.19) の catch
節によって例外が捕捉されるたびに生成される。この新しい変数は,その例外 (11.3,14.17) に対応した実際のオブジェクトを初期値とする。例外ハンドラパラメタは,catch
節によるブロックの実行が完了したときに,実質的にその存在を終了する。
catch
clause of a try
statement (14.19). The new variable is initialized with the actual object associated with the exception (11.3, 14.17). The exception-handler parameter effectively ceases to exist when execution of the block associated with the catch
clause is complete.for
文 (14.13) に入ったときにいつでも,そのブロック又はfor
文内に直接含まれている局所変数宣言文で宣言した個々の局所変数用に,新しい変数が生成される。局所変数宣言文は,その変数を初期設定する式を含んでもよい。しかしながら,初期化式をもつ局所変数は,それを宣言している局所変数宣言文が実行されるまで,初期化されない。(確実な代入の規則 (16.) は,局所変数の値が,それが初期化されるか又は別途値が代入される以前に使用されることを防止する。) 局所変数は,ブロック又はfor
文の実行が完了したときに,実質的にその存在を終了する。
for
statement (14.13), a new variable is created for each local variable declared in a local variable declaration statement immediately contained within that block or for
statement. A local variable declaration statement may contain an expression which initializes the variable. The local variable with an initializing expression is not initialized, however, until the local variable declaration statement that declares it is executed. (The rules of definite assignment (16) prevent the value of a local variable from being used before it has been initialized or otherwise assigned a value.) The local variable effectively ceases to exist when the execution of the block or for
statement is complete.switch
文 (14.10) に関係する。そこでは,制御が,局所変数宣言文の実行を迂回してブロックに入ることができる。しかしながら,確実な代入 (16.) の規則による制限のために,この迂回した局所変数宣言文で宣言した局所変数は,代入式 (15.26) によって,値を確実に代入されるまでは,使用できない。
switch
statement (14.10), where it is possible for control to enter a block but bypass execution of a local variable declaration statement. Because of the restrictions imposed by the rules of definite assignment (16), however, the local variable declared by such a bypassed local variable declaration statement cannot be used before it has been definitely assigned a value by an assignment expression (15.26). 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; } }
final
と宣言できる。最終変数は一回しか代入できない。代入の直前に確実に未代入ではない限り (16.),最終変数への代入は,コンパイル時エラーとなる。
final
. A final variable may only be assigned to once. It is a compile time error if a final variable is assigned to unless it is definitely unassigned (16) immediately prior to the assignment.未初期化最終(blank final) は,宣言で初期化子を欠いている最終変数とする。
final
変数は,一度代入されると常に同じ値をもつ。final
変数がオブジェクトへの参照を保持する場合,オブジェクトの状態はオブジェクトの演算によって変わるかもしれないが,変数は常に同じオブジェクトを参照する。配列はオブジェクトなので,これは配列にも適用される。final
変数が配列への参照を保持する場合,配列の構成要素は配列の演算によって変わるかもしれないが,変数は常に同じ配列を参照する。
final
variable has been assigned, it always contains the same value. If a final
variable holds a reference to an object, then the state of the object may be changed by operations on the object, but the variable will always refer to the same object. This applies also to arrays, because arrays are objects; if a final
variable holds a reference to an array, then the components of the array may be changed by operations on the array, but the variable will always refer to the same array.
変数をfinal
と宣言することは,値が変わらないということを表す有益な情報となるので,プログラムエラーの回避を助けるものとなる。
final
can serve as useful documentation that its value will not change and can help avoid programming errors.次に例を示す。
クラスclass Point { int x, y; int useCount; Point(int x, int y) { this.x = x; this.y = y; } final static Point origin = new Point(0, 0); }
Point
は final
クラス変数 origin
を宣言する。origin
変数は,座標が (0, 0) のクラスのインスタンスPoint
となるオブジェクトへの参照を保持する。変数 Point.origin
の値は絶対に変わらず,初期化子によって生成される同じ Point
オブジェクトへいつも参照する。しかし,この Point
オブジェクトの演算はその状態を変えるかもしれない。例えば,useCount
を変更したり,間違ってx
又は y
座標を変更してしまうことがあるかもしれない。
Point
declares a final
class variable origin
. The origin
variable holds a reference to an object that is an instance of class Point
whose coordinates are (0, 0). The value of the variable Point.origin
can never change, so it always refers to the same Point
object, the one created by its initializer. However, an operation on this Point
object might change its state-for example, modifying its useCount
or even, misleadingly, its x
or y
coordinate.
byte
については,デフォルト値はゼロ,すなわち (byte)0
とする。
byte
, the default value is zero, that is, the value of (byte)0
.short
については,デフォルト値はゼロ,すなわち (short)0
とする。
short
, the default value is zero, that is, the value of (short)0
.int
については,デフォルト値はゼロ,すなわち 0
とする。
int
, the default value is zero, that is, 0
.long
については,デフォルト値はゼロ,すなわち 0L
とする。
long
, the default value is zero, that is, 0L
.float
については,デフォルト値は正のゼロ,すなわち 0.0f
とする。
float
, the default value is positive zero, that is, 0.0f
.double
については,デフォルト値は正のゼロ,すなわち 0.0d
とする。
double
, the default value is positive zero, that is, 0.0d
.char
については,デフォルト値は空文字,すなわち '\u0000'
とする。
char
, the default value is the null character, that is, '\u0000'
.boolean
については,デフォルト値は false
とする。
boolean
, the default value is false
.null
とする。
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
Point
を準備するとき (12.3.2) に発生する npoints
のデフォルト初期化,並びに新しい Point
をインスタンス化するときに発生する x
,y
及び root
のデフォルト初期化を示している。クラス及びインタフェースのロード,リンク及び初期化に関するあらゆる面の詳細な規定,並びに新しいクラスインスタンスを生成するためのクラスのインスタンス化の規定については,12を参照のこと。
npoints
, which occurs when the class Point
is prepared (12.3.2), and the default initialization of x
, y
, and root
, which occurs when a new Point
is instantiated. See 12 for a full description of all aspects of loading, linking, and initialization of classes and interfaces, plus a description of the instantiation of classes to make new class instances.
すべてのオブジェクトは,次に示すどれかのクラスに属する。つまり,そのオブジェクトを生成した生成式で言及したクラス,オブジェクトを生成するための自己反映的メソッドを呼び出すために Class
オブジェクトが使用されたクラス,又は文字列連結演算子 +
(15.18.1) によって暗黙に生成されたオブジェクト用の String
クラス,のどれかに属する。このクラスを,そのオブジェクトのクラス(class of the object) と呼ぶ。(この節の最後で規定するとおり,配列もまたクラスを持つ。) オブジェクトは,そのクラス及びそのクラスのすべての上位クラスのインスタンスであるという。
Class
object was used to invoke a reflective method to produce the object, or the String
class for objects implicitly created by the string concatenation operator +
(15.18.1). This class is called the class of the object. (Arrays also have a class, as described at the end of this section.) An object is said to be an instance of its class and of all superclasses of its class.
変数又は式が"実行時型"を持つということがある。これは実行時における変数又は式の値がnull
でないと仮定して,その値によって参照されるオブジェクトのクラスを言及する。
null
.
変数のコンパイル時の型は常に宣言されており,式のコンパイル時の型はコンパイル時に推論できる。コンパイル時の型は,その変数が持つことのできる値,又は実行時に式が生成することのできる値を制限する。変数の実行時の値が null
以外の参照ならば,それは,クラスをもつオブジェクト又は配列を参照する。そのクラスは,必然的にコンパイル時の型と互換となる。
null
, it refers to an object or array that has a class, and that class will necessarily be compatible with the compile-time type.変数又は式が,インタフェース型のコンパイル時型をもったとしても,インタフェースのインスタンスそのものは存在しない。インタフェース型の変数又は式は,そのインタフェースを実装した (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; } }
Test
のメソッド main
の局所変数 p
は,型 Point
を持ち,クラス Point
の新しいインスタンスへの参照が初期値として代入される。
p
of the method main
of class Test
has type Point
and is initially assigned a reference to a new instance of class Point
.cp
は,型 ColoredPoint
を持ち, クラス ColoredPoint
の新しいインスタンスへの参照が初期値として代入される。
cp
similarly has as its type ColoredPoint
, and is initially assigned a reference to a new instance of class ColoredPoint
.cp
の値の変数 p
への代入によって,p
は,オブジェクト ColoredPoint
への参照を保持する。これは ColoredPoint
が Point
の下位クラスなので許される。そこで,クラス ColoredPoint
は,型 Point
と代入互換 (5.2) となる。オブジェクト ColoredPoint
は,Point
のすべてのメソッドに対する支援を含む。ColoredPoint
固有のフィールド r
,g
,および b
に加えて,クラス Point
のフィールド,すなわち,x
及び y
も持つ。
cp
to the variable p
causes p
to hold a reference to a ColoredPoint
object. This is permitted because ColoredPoint
is a subclass of Point
, so the class ColoredPoint
is assignment compatible (5.2) with the type Point
. A ColoredPoint
object includes support for all the methods of a Point
. In addition to its particular fields r
, g
, and b
, it has the fields of class Point
, namely x
and y
.c
は,その型として,インタフェース型 Colorable
を持つ。そこで,Colorable
を実装するクラスのいかなるオブジェクトへの参照も保持できる。特に,ColoredPoint
の参照を保持できる。
c
has as its type the interface type Colorable
, so it can hold a reference to any object whose class implements Colorable
; specifically, it can hold a reference to a ColoredPoint
.new Colorable()
" などの式は意味がない。これは,インタフェースのインスタンスは生成できず,クラスのインスタンスだけが生成可能なためである。
new Colorable()
" is not valid because it is not possible to create an instance of an interface, only of a class.getClass
は,配列オブジェクトに対して呼び出した時は,配列のクラスを表す(クラス Class
の) クラスオブジェクトを返す。
getClass
, when invoked for an array object, will return a class object (of class Class
) that represents the class of the array.
配列用のクラスは,識別子としては正当でない奇妙な名前を持つ。例えば 構成要素が int
の配列のクラスは,"[I
" という名前をもつ。したがって,式
int
components has the name "[I
" and so the value of the expression:の値は,文字列new int[10].getClass().getName()
"[I"
となる。詳細は,Class.getName
の規定を参照すること。
"[I"
; see the specification of Class.getName
for details.
目次 | 前 | 次 | 索引 | Java言語規定 第2版 |