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

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

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

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

Q&A

解決済

1回答

5105閲覧

JavaのClassクラスについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

1グッド

1クリップ

投稿2016/08/11 01:14

編集2016/08/11 01:23

JavaのClassクラスについての質問です。
これを参考にしました。
http://qiita.com/SHOSI/items/ea713e6205257ab8617b

「全てのクラスのスーパクラスであるObjectクラスにgetClass()問いメソッドが実装されており、サブクラスのインスタンス生成時に該当のサブクラスのClass情報をClassクラスのインスタンスとして生成し、保持します。
また、同時にObjectクラスにはclassというpublic static finalフィールドが存在し、クラスロード時に生成され、String.classというようにすることで、対象のクラスのClassクラスを取得することができる。」

実際、String.classというふうにすれば、StringのClassクラスがえられるわけですが、Objectクラスを見ていても、classというフィールドが見当たりません。
また、
Class<?> str = String.class;

とすれば、classクラスのインスタンスが得られるというのもよくわかりません。
メソッドであれば返り値がそのインスタンスなんだろうと思いますが、フィールドでどうしてインスタンスが得られるのでしょうか。

また、isArray()メソッドについて、
この Class オブジェクトが配列クラスを表すかどうかを判定します
とリファレンスには書いているのですが、これってどういう意味なんでしょうか。
配列変数をフィールドに持つという意味ではないのですよね?

ご存知の方いらっしゃいましたら、回答お願いします。

Mr_Roboto👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

Objectクラスを見ていても、classというフィールドが見当たりません。

元記事がフィールドと書いているのはわかりやすさのためなのかもしれませんが、
.class はJava言語仕様によればリテラルであり、10Lと書くとlongにしてくれるとかそういうことに近い感じですね。

http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.8.2

15.8.2. Class Literals

A class literal is an expression consisting of the name of a class, interface, array, or primitive type, or the pseudo-type void, followed by a '.' and the token class.


isArray()メソッドについては、配列かどうかがわかるのでどういう意味と言われてもそのままなんですけど、以下の様なコードであればわかるでしょうか。

java

1import java.lang.reflect.Array; 2 3public class IsArrayUsage { 4 5 public static void main(String[] args){ 6 7 Object o = new int[]{ 1, 2 }; 8 printValue(o); 9 10 o = "Hello world"; 11 printValue(o); 12 } 13 14 private static void printValue(Object o){ 15 // Objectが何だか知らないが、isArray()を使うと配列かどうか判断できる。 16 if(o.getClass().isArray()){ 17 for(int i = 0; i < Array.getLength(o); i++){ 18 System.out.println(Array.get(o,i)); 19 } 20 }else{ 21 System.out.println(o); 22 } 23 } 24}

(一応言っておくと訳もなくObjectに入れるのはよくないコードです。)

投稿2016/08/11 02:14

flied_onion

総合スコア2604

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

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

退会済みユーザー

退会済みユーザー

2016/08/11 11:48

回答ありがとうございます。 使い方については理解できましたが、Classインスタンスは「クラスの情報」が詰まったインスタンスではないのでしょうか。 「現実世界にある一つのJavaクラス」を表していると思っていたのですが。。 このコードだとフィールドに対して、それが配列であるかがboolean型として返ってきています。 しかし、APIリファレンスを見ますと、「このClassクラスが配列クラスかどうかを判定できます。」と書いております。 配列クラスが何かよくわかりませんが、「クラス」についてのものじゃないのでしょうか。 すいません、もう一点あります。 getClass()メソッドについてですが、呼び出すときに 変数名.getClass() としていますね。 この変数名はインスタンス変数じゃないといけないのではないでしょうか。 flied_onionさんのコードはインスタンス化はしていないわけですが、エラーにもならずきちんと動作しますが、なぜでしょうか。
flied_onion

2016/08/11 12:26

> Classインスタンスは「クラスの情報」が詰まったインスタンスではないのでしょうか。 このあたりはドキュメントを見てくださいとしか言えないです。 https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Class.html > Classクラスのインスタンスは、実行中のJavaアプリケーションのクラスおよびインタフェースを表します。列挙はクラスの一種、注釈はインタフェースの一種です。同様にどの配列も、同じ要素のタイプおよび次元数を持つすべての配列により共有されるClassオブジェクトとしてリフレクトされるクラスに属します。 配列もクラスに属します。 では、そのクラスが配列かどうかを見極める術はなにかということで、isArray()が用意されているというだけです。 > この変数名はインスタンス変数じゃないといけないのではないでしょうか。 変数名ですのでプリミティブ型(intなど)でない限りインスタンス変数でしかありえません(値がnullかどうかという話はありますが)。 main関数で new したものを渡していますので、オブジェクトとして生成されたインスタンスです。 インスタンス化していないというのはどこを指していますか?メソッド側でインスタンス化していないからということでしょうか。 インスタンスをメソッド引数に渡せばインスタンスのままです。 どういうエラーが起きると思いましたか? 変数名.getClass() としたとき(なんらかのメソッドを呼び出している時)変数名の型がなんであれ(クラスであれインターフェースであれ)、 * 呼び出したメソッドを持つものでなければならない * nullではならない(インスタンスが生成されていなければならない) という点は正しいです。 上記コードでインスタンス変数ではないと感じるなら、いったんいろいろとコードを書いて感覚をつかんで見るのも手かと思います。
退会済みユーザー

退会済みユーザー

2016/08/12 14:59

大方理解できました。 配列もクラスに属するとのことですが、そうするとあるクラスの中に配列を用いた部分があれば、その状態は「クラスの中にクラスがある」という風に描写できるということになるのでしょうか。 また、質問とは少しずれるのですが、ちょっと質問させてください。 「main関数で new したものを渡していますので、オブジェクトとして生成されたインスタンスです。」 なるほど、つまりoはObject型のインスタンスというわけですね。 とすると、配列を作る時に使うnewというのはインスタンスを生成しているということでよろしいでしょうか。
flied_onion

2016/08/12 15:17

> なるほど、つまりoはObject型のインスタンスというわけですね。 違います。int[]のインスタンスを生成して、Object型参照変数 oに入れています。 > 配列を作る時に使うnewというのはインスタンスを生成しているということでよろしいでしょうか。 newキーワードは配列やオブジェクトを生成しています。 このあたりの質問が出る状態であれば、やはり実際にコードを書いた方が良いと思います。理解を深めるにはそうした方が良いでしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問