クラスとタイプの違い


105

Javaが初めてなので、クラスタイプの概念が混同されています。たとえば、オブジェクト"Hello World!"タイプ Stringまたはクラスに 属すべきStringですか?それとも両方?


24
最近、「初心者」スタイルの質問が良いかどうかにかかわらず、反対票を投じようとする傾向があります。控えめに言っても、それは迷惑です。
nico_c 2013年

9
また、有権者が理解できない質問に反対票を投じる...
ローン侯爵

4
あなたが初心者の質問を言うとき、反対票を投じるのは一種の失礼だと私は同意します。問題と人々が反対票を投じている理由は、これがスタックオーバーフローを引き起こすためです:)
MarkoLazić13年

13
これは素晴らしい質問です。そして、締めくくる3票は、オープン維持するために投票できる必要がある理由です。私がJavaを学んでいたとき、OO専門用語が最大の障害であったことを今でも覚えています。
ローレンスドル2013年

4
@nickecarlo以前はFAQにポイントがありましたが、去年かそこらで取り除かれたようです-「この質問は研究の深刻な欠如を示し、質問する前にそれを解決するために行われた努力の兆候を示していません」ここにいる人が実際に「プログラミング101」を他の人に説明するのに時間を浪費している代わりに、Googleが解決できるでたらめな質問がたくさんあるのは不愉快です。
TC1 2013年

回答:


123

クラスはタイプです。インターフェースはタイプです。プリミティブはタイプです。配列はタイプです。

したがって、すべての型もクラス(列挙定数を含む)、インターフェース、プリミティブ、または配列のいずれかです。

タイプには、プリミティブタイプと参照タイプの2つの異なるカテゴリがあります。

  • プリミティブ型の変数は、常に同じ型のプリミティブ値を保持します。このような値は、その変数に対する代入演算によってのみ変更できます。
  • 参照型の変数は、常にオブジェクトへの参照の値を保持します。配列を含むすべてのオブジェクトは、クラスのメソッドをサポートしますObject。参照型は、クラス型(列挙型を含む)、インターフェース型、および配列型です。

すべてのデータには、その構造を定義するタイプがあります。つまり、使用するメモリの量、データのレイアウト、さらに重要なことに、データとの対話方法です。

プリミティブ型の例:

  1. int
  2. float
  3. char
  4. boolean

クラスタイプの例:

  1. String
  2. Integer
  3. Boolean
  4. ArrayList
  5. StringBuilder

インターフェースタイプの例:

  1. Collection
  2. List
  3. Map
  4. Serializable

配列型の例:

  1. int[]
  2. String[]
  3. Integer[][][]

基本的に、変数として参照できるものはすべて型を持ち、クラスは型の一種です。

詳細はこちら:http : //docs.oracle.com/javase/specs/jls/se8/html/jls-4.html


6
配列を忘れないでください。
ポールベローラ2013年

1
あなたが何を書こうとしていたのかわからないので、私は自分で編集を行いませんが、クラスは「タイプのタイプ」ではなく「タイプのタイプ」であると言ったほうがうまくいくかもしれません
CVn

@MichaelKjörlingはい、それはそれを言うより良い方法です。更新します。
ブランドン2013年

3
null型を忘れました(JLS 4.1を参照)。
user1803551 2014

1
@AndyDong抽象クラスは依然としてクラスです。
ブランドン

6

TLDR-クラスはJavaのタイプの1つです。

注-答えを完全に理解するには、Javaのジェネリックについて少し考えている必要があります。


違いを理解するために、まずJavaでのタイプとは何かを理解しましょう。

JLS SE 10によれば、

Javaプログラミング言語には、プリミティブ型§4.2)と参照型(§4.3)の2種類のがあります 。

プリミティブタイプとは

a)整数型は、それぞれ値が8ビット、16ビット、32ビット、64ビットの符号付き2の補数の整数であるbyte、short、int、およびlongと、値が16ビットのcharです。 UTF-16コード単位を表す符号なし整数(§3.1)。

b)浮動小数点型は、値に32ビットIEEE 754浮動小数点数が含まれるfloatと、値に64ビットIEEE 754浮動小数点数が含まれるdoubleです。

c)ブール型には、trueとfalseの2つの値があります。

では、参照型とは何でしょうか。

参照型には、クラス型§8.1)、インターフェース型§9.1)、型変数§4.4)、配列型§10.1)の4種類があります

1つずつ説明します。

JLSでの方法を見ると、Classは次のように定義されています。

クラス宣言は新しい名前付き参照型を指定します。

クラス宣言には、通常のクラス宣言と列挙型宣言の 2種類があります。

ClassDeclaration:
NormalClassDeclaration 
EnumDeclaration
NormalClassDeclaration:
{ClassModifier} class TypeIdentifier [TypeParameters] [Superclass] [Superinterfaces] ClassBody

ご覧のとおり[TypeParameters]、これはクラス型にこれらのジェネリッククラスも含まれていることを示しています。

class Example<T>{

}

クラスタイプが呼び出されます Example

簡単に言うと、クラス型は、列挙型、通常の(非ジェネリック)クラスStringなどのほか、ジェネリッククラスもカバーします。

同様に、インターフェイスと配列の型も明確であることを願っています。配列タイプとはint[]String[]などの意味です。

最後の部分、タイプ変数に行きましょう。彼らは何ですか ?

型変数は、クラス、インターフェース、メソッド、およびコンストラクターの本体で型として使用される非修飾識別子です。

その下のJLSの例で理解してみましょう。

class Test {
    <T extends C & I> void test(T t) {  
        t.mI();           // OK
        t.mCPublic();     // OK 
        t.mCProtected();  // OK 
        t.mCPackage();    // OK

    } 
}

methodパラメータのオブジェクトの型がわかりますT。はい、これTはType変数であり、参照として使用できます。はい、そうです。(この奇妙な例を理解できませんでした-Javaのジェネリックメソッドとは何かを学びます)

これで答えは完成です。


4

「タイプ」はより包括的なカテゴリです。Javaの変数には、3種類のタイプがあります。intやfloatなどの8つの「プリミティブ」タイプ、インターフェース、クラスです。(変数ではなく)値は、プリミティブインスタンスまたはクラスインスタンスにすることができます。


2

「タイプ」は「データのタイプ」を定義します

例:「hello world」は文字列です->「hello world」は文字列型です(intとは異なり、文字列は事前データではないため、「hello world」は文字列クラス型と言えます)

10はint-> 10は整数データ型です。


5
JavaではInteger!= intなので、整数を使用して整数を説明する場合は注意してください。
nico_c 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.