質問するログイン新規登録

回答編集履歴

3

補足

2017/04/06 14:48

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -36,7 +36,7 @@
36
36
  「クラスを==で比較するというのはどういう意味?」ということでしょうか?
37
37
 
38
38
  ---
39
- 追記:コメントいただいたので説明を試みます。実は自分には分かりやすい回答が難しく感じます。というのは自分がオブジェクト指向に初めて触れたときにちょっと混乱した経験があるからです。下手な説明をするよりどのように使うかの実例を示してみます。
39
+ 追記1:コメントいただいたので説明を試みます。実は自分には分かりやすい回答が難しく感じます。というのは自分がオブジェクト指向に初めて触れたときにちょっと混乱した経験があるからです。下手な説明をするよりどのように使うかの実例を示してみます。
40
40
 
41
41
  ```java
42
42
  Object[] variousObjects = new Object[] {
@@ -70,3 +70,19 @@
70
70
 
71
71
  ...ということになるのですが
72
72
  スミマセン。わかるように説明できている気がしないです... orz
73
+
74
+ ----
75
+ 追記2:質問者さんのコメントを拝見し少し補足します。クラスの話をする際には用語の問題で混乱しがちです。「"a"の型はjava.lang.String型です」といっているときのjava.lang.Stringは「**型の名前**」、その名前に対応するクラスの実体がありそれが「**"java.lang.String"という名前のクラスインスタンス**」と言ったらどうでしょう。普段何気なく会話しているときは型の名前もその名前を持つクラスインスタンスもどちらも「長ったらしいので」クラスと呼ぶことが多いです。しかし本質問のような内容をきっちり議論する際には厳密に区別した方がいいと思います。
76
+
77
+ // クラスの名前の例(変数に代入したり比較したりできません。只の名前であって値ではありません)
78
+ import **java.lang.String**;
79
+ class **java.lang.String** { ... }
80
+ **java.lang.String** name;
81
+ if (anObject isinstanceof **java.lang.String**) { ... }
82
+
83
+ // クラスの実体の例(変数に代入したり比較したりできる値です)
84
+ Class<?> cls;
85
+ cls = **java.lang.String.class**;
86
+ cls = **"this is a string".getClass()**;
87
+
88
+ 「値」って何という話になってきますかね・・・ますます混乱してしまうでしょうか・・・?

2

コードの間違いを訂正

2017/04/06 14:48

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -45,10 +45,10 @@
45
45
  new Object().getClass(),
46
46
  "this is a string".getClass(),
47
47
  };
48
- for (Object anObject in variousObjects) {
48
+ for (Object anObject : variousObjects) {
49
49
  Class<?> aClass = anObject.getClass();
50
50
  boolean result = testMethod(aClass);
51
- System.out.println("%-5s : %s%n", result, aClass.getName());
51
+ System.out.printf("%-5s : %s%n", result, aClass.getName());
52
52
  }
53
53
  ```
54
54
 

1

追記

2017/04/06 14:19

投稿

KSwordOfHaste
KSwordOfHaste

スコア18406

answer CHANGED
@@ -33,4 +33,40 @@
33
33
 
34
34
  「クラスって何?」ということでしょうか?
35
35
  「Classクラスって何?」ということでしょうか?
36
- 「クラスを==で比較するというのはどういう意味?」ということでしょうか?
36
+ 「クラスを==で比較するというのはどういう意味?」ということでしょうか?
37
+
38
+ ---
39
+ 追記:コメントいただいたので説明を試みます。実は自分には分かりやすい回答が難しく感じます。というのは自分がオブジェクト指向に初めて触れたときにちょっと混乱した経験があるからです。下手な説明をするよりどのように使うかの実例を示してみます。
40
+
41
+ ```java
42
+ Object[] variousObjects = new Object[] {
43
+ new Object(),
44
+ "this is a string",
45
+ new Object().getClass(),
46
+ "this is a string".getClass(),
47
+ };
48
+ for (Object anObject in variousObjects) {
49
+ Class<?> aClass = anObject.getClass();
50
+ boolean result = testMethod(aClass);
51
+ System.out.println("%-5s : %s%n", result, aClass.getName());
52
+ }
53
+ ```
54
+
55
+ 結果の出力は以下のようになります。
56
+
57
+ true : java.lang.Object
58
+ false : java.lang.String
59
+ true : java.lang.Class
60
+ true : java.lang.Class
61
+
62
+ この例でvariousObjectsの各要素は全て参照型のオブジェクトなのですが、参照型のオブジェクトの型は「そのオブジェクトのクラス」と同じ意味になります。上のコードでanObject.getClass()としている部分が「変数anObjectの中身にある何かのオブジェクトの型を求める」ことになります。
63
+ このメソッドは「あるオブジェクトの型(=クラス)」を引数に渡すとそのクラスが
64
+
65
+ - java.lang.Objectなのか
66
+ - java.lang.Classなのか
67
+ - 上記以外か
68
+
69
+ を判定するメソッドということになります。ところでクラスは`new Object()`のようにプログラムコード上では「単なる名前」であるかのように見えることが多いですが実際は"java.lang.Object"という名前をもった「クラスの実体」が存在します。その実体は前述のように`anObject.getClass()`とすると取り出せます。また同じ型のインスタンスに対してgetClassすると常に同一のクラス実体が得られます。よってクラスどおしの比較は==演算子で行えます。(equalsで比較しても同じ結果になりますが)
70
+
71
+ ...ということになるのですが
72
+ スミマセン。わかるように説明できている気がしないです... orz