|
〜クラス編〜 基本型と参照型 |
|
今回やる、この基本型と参照型と言うのは理解してないで使うと底無しぬまのような 地獄におちいるです・・・。 まずは簡単に説明をしちゃうです〜 基本型:変数の中にはデータの値その物が入るです。 参照型:変数の中にはデータがある場所を指す物が入っているです。 そして、それぞれの型には次のような物があるです〜 基本型:int, double, long, boolean などなど第三章で出てきた変数の型です。 参照型:配列, オブジェクト, 文字列 配列というのはint[] a;などで宣言されたときのaそのものです〜 配列の値(a[5])などと間違わないでほしいです〜。配列の値は基本型です。 それでは、この基本型と参照型がどのぐらい違うのかサンプルプログラムで見て 行くです〜。もしかしたらマジックの世界に入ったみたいに分けが分からなくなって しまうかもしれないです〜。
Rei16_1とRei16_2のメインメソッドでは処理は違うですが同じ処理をしているで す〜。二人の人が同じ場所からスタートするために、Rei16_1ではyokutoStage = yotaStageをRei16_2ではyokuto=yotaを行ってるです〜。その後にyotaがステージ16 にyokutoがステージ12に移動しているですね!そして最後にお互いが今どこに居るのか を出力しているです〜。 しかし、ここでRei16_1ではちゃんとそれぞれ移動した場所に行っているのに、 Rei16_2ではなぜかyotaもyokutoと一緒の場所ステージ12に居ることに気がつくと思 うです。これはいったいと言った感じですね!その答えこそが基本型と参照型の違いな のです〜 基本型 基本型には、int a = 10;などとやったときに変数aの中には10が入ってくるです〜 そしてa = b;などとやった場合aの中にはbの値が入ってくるですね!これは過去の変数 のところでやってきた通りのことですね! 参照型 参照型は、まず最初にメモリの中に取り込む操作をしないと行けないです〜。これは 第十章で触れたことだと思うですが、今回はその続きでnew演算子を使ってオブジェクト を作ると言ったですが、MagicWorld yota = new MagicWorld();を実行したときにyota の中には、MagicWorldのオブジェクトが入るのではなく、MagicWorldのオブジェクトを 指す物が入ってくるのです〜。そして、今回のサンプルのyokuto = yotaのような処理 を行った場合yotaが指している場所をyokutoに代入すると言った意味になるです〜。 つまりyotaもyokutoも同じ場所を指していることになるです〜。と言うことは、yotaの 指している物の値が変わればyokutoの指している物の値も変わるですし、yokutoの指し ている物の値が変わればyotaの指している物の値も変わると言う感じになるです〜。 話が複雑になってしまったのでまとめるですと、 指している場所には物(オブジェクト)があるです。 そして、yotaもyokutoも同じ場所を指していると言うことです〜 これら2つの型のイメージは次のようになってるです〜。
ここから先もう少し参照型についてやって行くです。 参照型の変数にどこも指していない事を書きたいとき 参照型の変数に、どこも指していないというようなことを書きたい場合は次のように 書くです〜。(今回のサンプルプログラム16_2を元にしてやるです〜) 1:MagicWorld yota; 2:yota = null; この2行目に出てきたnullというのが、どこも指していないときに使う命令です〜。 これでyotaはどこも指していないということになるですね! 参照型の値同士を比較したい場合 実は、参照型の場合、==演算子で等しいかどうか比較することができないのです。 もし==演算子で比較した場合正しい結果が返ってこないです〜。Javaプログラムの 身近な例で言うですと、文字列がそれにあたるです〜。没頭でも書いたですが、文字列 は参照型ですね!つまり==で比較しても予想外の結果が返ってくるだけなのです〜。 もう1つは、参照型では==演算子を使うこともできるですが、それ以外の演算子 <=など の演算子を指定するとコンパイルエラーになるです。できれば==演算子も使わない方が いいです〜。ちゃんと代わりに使える演算子みたいな物が用意されているので。 信用できない人は作ってみてもいいと思うです〜。実はすでにやろうとしていてうまく 行かなくて困ってる人もいたんではないかと思うです。 一応そのうまく動作しないサンプルプログラムを載せるです〜
そして参照型で使う==演算子の代わりになる物がequals()メソッドです〜。 これはすべての作成したオブジェクト(参照型の変数)が持っているメソッドです〜。 このメソッドを使って比較すれば正しい答えが出てくるです〜。 Rei16_3のそれぞれのif文の式を次のようにするです〜 s1 == s2 を s1.equals(s2) にする s1 == s3 を s1.equals(s3) にする そしてコンパイルしなおせば正しく出てくるです〜。 このequalsメソッドは、参照型の変数が指している場所が同じかどうかを比較する メソッドです。でもStringクラスの場合(文字列)のときのみ、指している場所ではな くその入っている値(文字列)が同じかどうかを調べるときに使うです。 今回のポイント @ 変数には基本型と参照型がある A 上の方に書いてある図がポイント B どこも参照させたくないときnullを使う C 参照型を比較するときはequals()メソッドを使う 参照型変数.equals(比較したい参照型変数); TOPに戻る Java講座に戻る |