質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Java

    14380questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Object.class、Class.classとはなんでしょうか?

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,215

chandra

score 1

前提・実現したいこと

Java初心者です。
現在勉強の最中なのですが、以下のようなコードが出てきて困っています。
これは一体何を目的とした判定なのでしょうか?
またどういう原理で動いているのでしょうか?

該当のソースコード

public boolean testMethod(Class<?> clazz) {
    if (clazz == Object.class || (clazz == Class.class )) {
    return true;
    }
    return true;
}

補足情報

java7を使用しています

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

一体何を目的とした判定なのでしょうか? 

なかなか回答が難しい気がしますが、このメソッドは何も有効なことをしないメソッドとしかいえない気がします。Class型のインスタンスの何を渡しても結果が常にtrueだからです。

もし質問者さんのタイプミスだとして例えば以下のように一方がfalseだと仮定すると、何がしかの意味は持ちますが・・・

(1)

public boolean testMethod(Class<?> clazz) {
  if (clazz == Object.class || clazz == Class.class) {
    return true;
  }
  return false;
}

そうだとしても質問者さんが本当に知りたいのが何かを判断するのが難しいです。

(2)

public boolean testMethod(int i) {
  if (i == 1 || i == 2) {
    return true;
  }
  return false;
}

このようなメソッドがあったとして「これは何を目的とした判定か」と聞かれても「1か2のどちらかかを判定する」としか言えず、それはメソッドに書いてあることそのものを答えたにすぎないからです。
(1)について何が目的かは言えませんが、何をしているかといえば「引数に渡されたクラスがObjectクラスなのかClassクラスなのかを判定する」ということになります。

質問者さんが本当に知りたいことは何でしょうか?

「クラスって何?」ということでしょうか?
「Classクラスって何?」ということでしょうか?
「クラスを==で比較するというのはどういう意味?」ということでしょうか?


追記1:コメントいただいたので説明を試みます。実は自分には分かりやすい回答が難しく感じます。というのは自分がオブジェクト指向に初めて触れたときにちょっと混乱した経験があるからです。下手な説明をするよりどのように使うかの実例を示してみます。

Object[] variousObjects = new Object[] {
  new Object(),
  "this is a string",
  new Object().getClass(),
  "this is a string".getClass(),
};
for (Object anObject : variousObjects) {
  Class<?> aClass = anObject.getClass();
  boolean result = testMethod(aClass);
  System.out.printf("%-5s : %s%n", result, aClass.getName());
}

結果の出力は以下のようになります。

true  : java.lang.Object
false : java.lang.String
true  : java.lang.Class
true  : java.lang.Class

この例でvariousObjectsの各要素は全て参照型のオブジェクトなのですが、参照型のオブジェクトの型は「そのオブジェクトのクラス」と同じ意味になります。上のコードでanObject.getClass()としている部分が「変数anObjectの中身にある何かのオブジェクトの型を求める」ことになります。
このメソッドは「あるオブジェクトの型(=クラス)」を引数に渡すとそのクラスが

  • java.lang.Objectなのか
  • java.lang.Classなのか
  • 上記以外か

を判定するメソッドということになります。ところでクラスはnew Object()のようにプログラムコード上では「単なる名前」であるかのように見えることが多いですが実際は"java.lang.Object"という名前をもった「クラスの実体」が存在します。その実体は前述のようにanObject.getClass()とすると取り出せます。また同じ型のインスタンスに対してgetClassすると常に同一のクラス実体が得られます。よってクラスどおしの比較は==演算子で行えます。(equalsで比較しても同じ結果になりますが)

...ということになるのですが
スミマセン。わかるように説明できている気がしないです... orz


追記2:質問者さんのコメントを拝見し少し補足します。クラスの話をする際には用語の問題で混乱しがちです。「"a"の型はjava.lang.String型です」といっているときのjava.lang.Stringは「型の名前」、その名前に対応するクラスの実体がありそれが「"java.lang.String"という名前のクラスインスタンス」と言ったらどうでしょう。普段何気なく会話しているときは型の名前もその名前を持つクラスインスタンスもどちらも「長ったらしいので」クラスと呼ぶことが多いです。しかし本質問のような内容をきっちり議論する際には厳密に区別した方がいいと思います。

// クラスの名前の例(変数に代入したり比較したりできません。只の名前であって値ではありません)
import java.lang.String;
class java.lang.String { ... }
java.lang.String name;
if (anObject isinstanceof java.lang.String) { ... }

// クラスの実体の例(変数に代入したり比較したりできる値です)
Class<?> cls;
cls = java.lang.String.class;
cls = "this is a string".getClass();

「値」って何という話になってきますかね・・・ますます混乱してしまうでしょうか・・・?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/05 19:58

    大変失礼しました。タイプミスでした。if文の中の方がtrueでした。
    知りたいことはご質問いただいたとおり、「クラスを==で比較するというのはどういう意味?」ということで、
    clazz == Object.class と clazz == Class.class の比較が何をしているかです。
    前者はインスタンス化したクラスかどうか、後者はインスタンス化していないクラスかどうか
    のようなことを確認しているのかなぁとなんとなくは考えているのですが、想像の域を出ません。。

    キャンセル

  • 2017/04/05 20:05

    なるほど、何に疑問を感じておられるか見えてきました。

    キャンセル

  • 2017/04/06 00:59

    ご丁寧にありがとうございます。testClassの引数が重要と理解しましたので周りのコードも確認したところ、clazzはgetClass()したものが格納されるようでした。
    重ねての質問で申し訳ないのですが、この場合clazz == Class.classの判定がfalseになることはあるのでしょうか?

    キャンセル

  • 2017/04/06 02:31 編集

    現に、この2番目はfalseを返しています(clazz == Object.class と clazz == Class.class の双方がfalseを返すため)。Class.classは、「Classクラスを表すClassインスタンス」です(かなりややこしいですが)。
    String型に対してgetClass()した段階では、あくまで「Stringクラスを表すClassインスタンス」であるため、一致しません。

    キャンセル

  • 2017/04/06 23:04

    コメントありがとうございます。
    >String型に対してgetClass()した段階では、あくまで「Stringクラスを表すClassインスタンス」であるため、一致しません。
    についてなのですが、KSwordOfHasteさんにいただいた例にある""this is a string".getClass()"の結果が"true:java.lang.Class"なのですがこれはClassクラスを表すClassインスタンスが取得できているということではないのでしょうか?
    xxxクラスを表すClassインスタンスという意味が理解できていません。。

    キャンセル

  • 2017/04/06 23:26 編集

    若干混乱されているような気がします。swordoneさんが捕足してくださったのは2番目の例です。chandraさんが上でおっしゃっているのは4番目の例ですよ?2番目の例はswordoneさんがおっしゃるとおりtestMethodの結果はfalseです。4番目の例はchandraさんがおっしゃるとおりtrueです。

    キャンセル

  • 2017/04/06 23:52

    大混乱しています。。すみません。。また、長くお付き合い頂きありがとうございます。
    その後冷静に(なったつもり)で見てみたところ一つ重要と思われるところに気づきました。for文内でさらにgetClass()していたというところです。
    最終的に評価されているものは2番目は"this is a test".getClass()(イコールjava.lang.String)になり、4番目は"this is a test".getClass().getClass()(イコールjava.lang.Class)になるという理解はあっていますか?

    キャンセル

  • 2017/04/06 23:53 編集

    > 4番目は"this is a test".getClass().getClass()(イコールjava.lang.Class)になるという理解はあっていますか?

    ほぼそのとおりです。"this is a test".getClass().getClass()(イコールjava.lang.Class.class)
    最後がjava.lang.Class.classという点にご注意を。自分の回答にその意味を「追記2」に書きましたので参考にしていただければと思います。
    ---
    本件はきっと最初は混乱してもよーく考えていると自然と「あぁそうか」とわかる瞬間がくると思うのですが、もしもう少し明確にしたいということでしたら、少しご自分で実際にコードを書いて色々な例を実際に見て、その上で頭の中をもう一度整理した上で詳しく質問したほうがよいと思います。

    キャンセル

  • 2017/04/07 00:10

    はい、質問した時に比べるとだいぶモヤモヤが晴れてきた気がします。自身でテストコードを書いてみて少し整理したいと思います。その上でまたご質問させていただくかもしれませんが、そのときはまたお付き合いいただけると幸いです。KSwordOfHasteさんだけでなくswordoneさんもお付き合いいただきありがとうございました。

    キャンセル

+1

Object.classやClass.classは、Classクラスのインスタンスです。
と、ドキュメントを貼りましたが、これを見ても何が何だかというのが正直なところだと思います(実際私も半分も理解できていません)。
例えばKSwordOfHasteさんが例に挙げた"this is a string"はStringクラスのインスタンスですが、
"this is a string".getClass()は、Stringクラスを表すClassクラスのインスタンスです。
Classクラスは主にプログラム実行中にプログラム自体を読み込んだり書き換えたりする(リフレクションという)用途に使います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/06 22:50

    コメントありがとうございます。リフレクション周りを勉強してみようと思います。

    キャンセル

0

testMethod が使われている箇所で何をしているかを考えるのがよいでしょう。
メソッド名が本当に testMethod などといういい加減な名前である場合、理解には相当の困難を伴いそうですが。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/06 01:00

    ありがとうございます。周りのコードを調べて引数に何が入るかを調べる契機になりました。

    キャンセル

同じタグがついた質問を見る

  • Java

    14380questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。