2016-03-26 11 views
2

私は現在大学でJavaクラスを取っています。これは私の最初のプログラミングクラスであり、私は理解できないものを見つけました。私が学んだように、変数を比較するには2つの方法があります。最初に使用している==!=<>=<、などなどint型、ダブル、などのプリミティブの変数の>=兆し。 2番目の方法は参照型に.equals()メソッドを使用することです。誰かが私にjavaの.getClass()メソッドを説明できますか?

私は.getClass()メソッドを使用すると、2つのクラスを.equals()メソッドと==/!=メソッドで比較できます。 ==/!=符号を使用できるので、オブジェクトのクラスを返す.getClass()メソッドはプリミティブ型を返す必要があると思います。しかし、私はJava APIのこのメソッドについて知っている唯一のものは、オブジェクトのクラスを返すことです。返される変数の型はわかりません。このメソッドはどのくらい正確に機能しますか?それは何を返すのですか?私は先生に尋ねようとしたが、彼女は知らなかった。ありがとうございました!

答えて

0

getClass()Classクラスのインスタンス(オブジェクト)を返します。各Javaクラスは、Classクラスの単一のインスタンスを持ち、2つのオブジェクトが同じクラスに属している場合、それら二つのオブジェクトのgetClass()が同じisntanceを返しますので、あなたがそれらを比較するための==を使用することができ、==種類を参照するために適用されたとき以来、決定しているので2つの参照が同じインスタンスを参照する場合

+0

'ClassLoader'について忘れないでください、hotzstの答えを見てください。 – vektor

+0

私はちょうどあなたの答えに感謝したいと思います。私が正しく理解すると、各クラスはClassクラスの一意のインスタンス(オブジェクト)を作成します。 getClass()メソッドを使用すると、そのクラスインスタンスへの参照が返されます。このように、!=と==を使用する場合、2つの異なるクラスを比較して、メモリ内の同じ参照を指しているかどうかを確認します。これは正しいですか? – John

2

コンパレータ==!=はアイデンティティの方法で、平等を比較します。ですから、これがどのようにプリミティブのために働くのかは明らかです。ただし、オブジェクトの比較にも使用できます。しかし、ほとんどの場合、これは期待どおりに機能しません。

Stringがリテラルとして格納されているため、同じ値を含むStringという2つのインスタンスを定義すると、同じリテラルが使用されます。両方のインスタンスが同じメモリ位置を指しているように、これを考えてください。

Enum Sは、したがって列挙値が同じインスタンスであるか、またはそうでない、基本的に定数の集合です。列挙型は同じ値を持つことはできませんが、別のインスタンスです。

Classオブジェクトについても同様で、これはgetClass()を呼び出すときに得られるものです。 Classオブジェクトは、最初に* .classファイルがロードされたときにClassLoaderによって作成されます。その後の呼び出しでは、同じClassオブジェクトが使用されます。したがって、Classのオブジェクトは==!=と比較されます。しかし、A.classが2つの異なるClassLoaderによってロードされている場合、それらから返されるクラスオブジェクトは同じインスタンスではないことに注意してください。

+3

_ "文字列はリテラルとして格納されているため、同じ値を含むStringのインスタンスを2つ定義すると、同じリテラルが使用されます。" _これは間違っています。これは**同じ文字列リテラルまたは内部文字列にのみ適用されますすべての**文字列は同じ値を持ちます。例: 'new String(" X ")!=" X "' –

-2

多型は、Javaにとって最も重要な機能の1つです。例えば:

//this shows one use of getclass method. 

public class Main { 

    public static void main(String[] args) { 
     Main m = new Main(); 
     Animal animal = new Animal(); 
     Human human = new Human(); 
     m.dosomething(animal);//print animal 
     m.dosomething(human);//print human 
    } 

    private void dosomething(Animal an){ 
     System.out.println(an.getClass().toString()); 
     } 

    } 

class Human extends Animal{ 

    private void dance(){ 
     } 
} 

class Animal{ 

    private void eat(){ 
     } 
} 
0

あなたが==!=は、2つのオペランドを比較する方法を知るための最初の必要性。 ==!=を参照型の比較に使用できない理由は、2つの参照型変数ののメモリアドレスを実際に比較するためです。だから、

私は二つの文字列がある場合:x以来

String x = "Hello"; 
String y = x; 

y二行目が実行された後、同じメモリアドレスを共有し、x == yがtrueと評価されました。

getClass()の場合も同様です。 メソッドは、オブジェクトのクラスをClass<T>オブジェクトとして返します。問題は、これが本当に評価される理由です。

x.getClass() == y.getClass() 

答えは簡単です。 xおよびyは両方ともタイプStringです。したがって、getClassを呼び出すと、同じインスタンスが返されます。これは、2つのオブジェクトが同じメモリアドレスを共有して返されることを意味します。

"しかし、同じ文字の文字列を==演算子と比較すると、falseに評価されます!"あなたは叫んだ。

これは、文字列が異なるメモリアドレスに配置されているためです。しかし、getClassが返すクラスは、それらが表すクラスが同じ場合、常に同じメモリアドレスになります。これは、方法がClassLoaderのためです。しかし、私はその専門家ではありません。

getClassによって返されるオブジェクトは、それらが表すクラスが同じ場合、同じメモリアドレスにあることだけを知る必要があります。

0

.getClassメソッドは、オブジェクトのクラスを返します。オブジェクトの新しいインスタンスを宣言すると、クラスを参照します。 1つのjvmには1つのクラスしか存在できませんが、それを参照する複数のオブジェクトがあります。したがって、2つのオブジェクトのクラスを取得すると、同じクラスを参照している可能性があります。

関連する問題