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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Java

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

Q&A

解決済

3回答

6371閲覧

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

chandra

総合スコア7

Java

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

0グッド

0クリップ

投稿2017/04/05 10:27

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

###該当のソースコード

java

1public boolean testMethod(Class<?> clazz) { 2 if (clazz == Object.class || (clazz == Class.class )) { 3 return true; 4 } 5 return true; 6}

###補足情報
java7を使用しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

投稿2017/04/06 02:26

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chandra

2017/04/06 13:50

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

0

ベストアンサー

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

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

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

(1)

java

1public boolean testMethod(Class<?> clazz) { 2 if (clazz == Object.class || clazz == Class.class) { 3 return true; 4 } 5 return false; 6}

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

(2)

java

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

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

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

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


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

java

1Object[] variousObjects = new Object[] { 2 new Object(), 3 "this is a string", 4 new Object().getClass(), 5 "this is a string".getClass(), 6}; 7for (Object anObject : variousObjects) { 8 Class<?> aClass = anObject.getClass(); 9 boolean result = testMethod(aClass); 10 System.out.printf("%-5s : %s%n", result, aClass.getName()); 11}

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

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 10:53

編集2017/04/06 14:48
KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chandra

2017/04/05 10:58

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

2017/04/05 11:05

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

2017/04/05 15:59

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

2017/04/05 17:32 編集

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

2017/04/06 14:04

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

2017/04/06 14:27 編集

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

2017/04/06 14:52

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

2017/04/06 14:57 編集

> 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」に書きましたので参考にしていただければと思います。 --- 本件はきっと最初は混乱してもよーく考えていると自然と「あぁそうか」とわかる瞬間がくると思うのですが、もしもう少し明確にしたいということでしたら、少しご自分で実際にコードを書いて色々な例を実際に見て、その上で頭の中をもう一度整理した上で詳しく質問したほうがよいと思います。
chandra

2017/04/06 15:10

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

0

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

投稿2017/04/05 12:55

koko_u

総合スコア936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chandra

2017/04/05 16:00

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問