例えば、なぜあなたはできるのでしょう:
int n = 9;
だがしかし:
Integer n = 9;
そしてあなたはできる:
Integer.parseInt("1");
だがしかし:
int.parseInt("1");
int
はプリミティブ型です。 int
型の変数は、表したい整数の実際のバイナリ値を格納します。 int
はクラスではないため、メソッドがないため、int.parseInt("1")
は意味がありません。
Integer
はクラスであり、Java言語の他のクラスと違いはありません。 Integer
store型の変数は、他の参照(オブジェクト)型と同じようにをInteger
オブジェクトに参照します。 Integer.parseInt("1")
は、クラスparseInt
から静的メソッドInteger
への呼び出しです(このメソッドは実際にはint
ではなくInteger
を返します)。
より具体的に言うと、Integer
はint
型の単一フィールドを持つクラスです。このクラスは、ジェネリック型やNULL可能性が必要な状況など、他のオブジェクトと同様にint
を扱う必要がある場合に使用されます。
Javaのすべてのプリミティブ型には、同等のラッパークラスがあります。
byte
はByte
を持っていますshort
はShort
を持っていますint
はInteger
を持っていますlong
はLong
を持っていますboolean
はBoolean
を持っていますchar
はCharacter
を持っていますfloat
はFloat
を持っていますdouble
はDouble
を持っていますラッパークラスはObjectクラスを継承し、プリミティブは継承しません。そのため、オブジェクト参照またはジェネリックと一緒にコレクションで使用できます。
Java 5以降、オートボクシングが行われ、プリミティブクラスとラッパークラス間の変換は自動的に行われます。しかし、これは微妙なバグやパフォーマンスの問題を引き起こす可能性があるので注意してください。変換について明示的であっても問題ありません。
整数は基本的にint型のラッパーです。 Integerクラスのすべての機能を使用して、生活を少し楽にすることができます。
もしあなたがJavaに慣れていないのであれば、あなたが理解するために学ぶべきことはJavaのドキュメントです。たとえば、 整数クラス について知りたいことはすべて詳しく説明されています。
これはIntegerクラスのドキュメントから直接抜けています:
Integerクラスは、オブジェクト内でプリミティブ型intの値をラップします。 Integer型のオブジェクトはint型の単一のフィールドを含みます。
Int変数は32ビット符号付き整数値を保持します。 Integer(大文字のI)は、(クラス)Integer型のオブジェクト、またはnullへの参照を保持します。
Javaはこの2つの間で自動的にキャストします。 Integerオブジェクトがint演算子への引数として指定されているか、int変数に割り当てられているか、int値が整数変数に割り当てられている場合は、Integerからintへこのキャスティングはボクシング/アンボクシングと呼ばれます。
Nullを参照するInteger変数が明示的または暗黙的にボックス化解除されている場合、NullPointerExceptionがスローされます。
(上記のテキストでは、「変数」という用語はローカル変数、フィールド、またはパラメータを意味します)
Integer
はJavaのラッパー型を表し、int
はプリミティブ型です。 Javaのプリミティブデータ型以外のものはすべて、Javaが高度に修飾された純粋なオブジェクト指向プログラミング言語であることを意味するオブジェクトとして実装されています。必要に応じて、すべてのプリミティブ型はJavaのラッパー型としても利用できます。プリミティブ型ではパフォーマンス上の利点があるため、ラッパー型は必要なときにだけ使用してください。
下記のようにあなたの例では。
Integer n = 9;
定数9
は 自動ボックス化されています (auto-boxing
とunboxing
はJava 5
以降)からInteger
まで自動的に出現するので、そのようなステートメントとInteger n = new Integer(9)
を使うことができます。これは実際にはステートメントInteger.valueOf(9).intValue();
を通して達成されます。
intはプリミティブ型であり、オブジェクトではありません。それはそれに関連付けられたメソッドがないことを意味します。整数はメソッド(parseIntなど)を持つオブジェクトです。
最近のJavaでは、自動ボクシング(およびアンボクシング)の機能があります。つまり、コンパイラは必要に応じてInteger.valueOf(int)またはinteger.intValue()を挿入します。それは実際に書くことが可能であることを意味します
Integer n = 9;
これは次のように解釈されます
Integer n = Integer.valueOf(9);
整数はラッパークラス/オブジェクト、整数はプリミティブ型です。この違いは、int値をコレクションに格納する場合に大きな役割を果たします。これは、値としてオブジェクトのみを受け入れるためです(jdk1.4まで)。オートボクシングのためJDK 5以降はまったく別の話です。
Javaではintはプリミティブデータ型ですが、IntegerはHelperクラスですが、あるデータ型を他のデータ型に変換するために使用されます。
例えば:
double doubleValue = 156.5d;
Double doubleObject = new Double(doubleValue);
Byte myByteValue = doubleObject.byteValue ();
String myStringValue = doubleObject.toString();
プリミティブデータ型は、Helperクラスが複雑でヒープメモリに格納されている最速のメモリを格納します。
「David Gassner」Java Essential Trainingからの参照。
これは Java:The Complete Reference第9版から取られています
Javaは、intやdoubleなどのプリミティブ型(単純型とも呼ばれる)を使用して、言語でサポートされている基本データ型を保持します。 オブジェクトではなくプリミティブ型が、パフォーマンスのためにこれらの量に使用されます。これらの値にオブジェクトを使用すると、最も単純な計算でも許容できないオーバーヘッドが追加されます。したがって、プリミティブ型はオブジェクト階層の一部ではなく、それらはObjectを継承しません。
プリミティブ型によるパフォーマンス上の利点にもかかわらず、オブジェクト表現が必要になる場合があります。たとえば、メソッドを参照してプリミティブ型を渡すことはできません。また、Javaによって実装されている標準データ構造の多くはオブジェクトを操作します。つまり、これらの(オブジェクト固有の)データ構造を使ってプリミティブ型を格納することはできません。これらの(そして他の)状況を処理するために、Javaは型ラッパーを提供します。これはオブジェクト内のプリミティブ型をカプセル化するクラスです。
ラッパークラスは、Javaのオートボクシング機能に直接関係しています。型ラッパーは、Double、Float、Long、Integer、Short、Byte、Character、およびBooleanです。これらのクラスは、プリミティブ型をJavaのオブジェクト階層に完全に統合することを可能にする幅広いメソッドを提供します。
int
は整数を表すプリミティブ型です。一方Integer
はint
をラップするObjectです。 Integer
オブジェクトは、16進数、文字列などへの変換など、より多くの機能を提供します。
Integer
と一緒にOOPの概念を使うこともできます。例えば、ジェネリックにはIntegerを使うことができます(すなわちCollection
<Integer>)。
int
はプリミティブデータ型ですが、Integer
はJavaの参照型またはラッパー型(クラス)です。
オートボクシングおよびボックス化解除の概念を導入したJava 1.5
の後は、両方とも初期化できます。このようなint
またはInteger
。
int a= 9
Integer a = 9 // both valid After Java 1.5.
なぜ
Integer.parseInt("1");
ではなくint.parseInt("1");
??
Integer
はjdk
ライブラリで定義されたクラスで、parseInt()
はInteger
クラスに属する静的メソッドです。
そのため、JavaではInteger.parseInt("1");
が可能です。しかし、Javaではint
はプリミティブ型です(キーワードのように仮定します)。そのため、parseInt()
をint
で呼び出すことはできません。