第十六章 
 〜クラス編〜
 基本型と参照型
 今回やる、この基本型参照型と言うのは理解してないで使うと底無しぬまのような
地獄におちいるです・・・。
 まずは簡単に説明をしちゃうです〜
  基本型:変数の中にはデータの値その物が入るです。
  参照型:変数の中にはデータがある場所を指す物が入っているです。
 そして、それぞれの型には次のような物があるです〜
  基本型:int, double, long, boolean などなど第三章で出てきた変数の型です。
  参照型:配列, オブジェクト, 文字列
 配列というのはint[] a;などで宣言されたときのaそのものです〜
 配列の値(a[5])などと間違わないでほしいです〜。配列の値は基本型です。
  それでは、この基本型と参照型がどのぐらい違うのかサンプルプログラムで見て
行くです〜。もしかしたらマジックの世界に入ったみたいに分けが分からなくなって
しまうかもしれないです〜。
サンプルプログラム16_1
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
class Rei16_1{
    public static void main(String[] args){
        int yotaStage, yokutoStage;
        yotaStage = 0;
        yokutoStage = yotaStage;

        System.out.println("まずはyotaさんから移動するです〜");
        yotaStage = 16;

        System.out.println("次にyokutoさんが移動するです〜");
        yokutoStage = 12;

        System.out.println("二人の居場所はそれぞれ・・・");
        System.out.println("現在" + yotaStage   + "番目の部屋にいます");
        System.out.println("現在" + yokutoStage + "番目の部屋にいます");
    }
}

サンプルプログラム16_2
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
class Rei16_2{
    public static void main(String[] args){
        MagicWorld yota, yokuto;
        yota = new MagicWorld();
        yokuto = yota;

        System.out.println("まずはyotaさんから移動するです〜");
        yota.nextStage(16);

        System.out.println("次にyokutoさんが移動するです〜");
        yokuto.nextStage(12);

        System.out.println("二人の居場所はそれぞれ・・・");
        yota.nowStagePrintln();
        yokuto.nowStagePrintln();
    }
}

class MagicWorld{
    private int stage;

    public void nextStage(int stage){
        this.stage = stage;
    }

    public void nowStagePrintln(){
        System.out.println("現在" + stage + "番目の部屋にいます");
    }
}

 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つは、参照型では==演算子を使うこともできるですが、それ以外の演算子 <=など
の演算子を指定するとコンパイルエラーになるです。できれば==演算子も使わない方が
いいです〜。ちゃんと代わりに使える演算子みたいな物が用意されているので。
信用できない人は作ってみてもいいと思うです〜。実はすでにやろうとしていてうまく
行かなくて困ってる人もいたんではないかと思うです。
一応そのうまく動作しないサンプルプログラムを載せるです〜
サンプルプログラム16_3
 1:
 2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
class Rei16_3{
    public static void main(String [] args){
        String s1 = "TeraNet";
        String s2 = "TeraNet";
        String s3 = "Tera";

        s3 = s3 + "Net";

        System.out.println(s1 + "\n" + s2 + "\n" +s3 + "\n");
        
        if(s1 == s2){
            System.out.println("s1とs2は等しいです〜");
        }

        if(s1 == s3){
            System.out.println("s1とs3は等しいです〜");
        }
    }
}

 そして参照型で使う==演算子の代わりになる物がequals()メソッドです〜。
これはすべての作成したオブジェクト(参照型の変数)が持っているメソッドです〜。
このメソッドを使って比較すれば正しい答えが出てくるです〜。
Rei16_3のそれぞれのif文の式を次のようにするです〜
 s1 == s2 を s1.equals(s2) にする
 s1 == s3 を s1.equals(s3) にする
そしてコンパイルしなおせば正しく出てくるです〜。
 このequalsメソッドは、参照型の変数が指している場所が同じかどうかを比較する
メソッドです。でもStringクラスの場合(文字列)のときのみ、指している場所ではな
くその入っている値(文字列)が同じかどうかを調べるときに使うです。


今回のポイント
 @ 変数には基本型と参照型がある
 A 上の方に書いてある図がポイント
 B どこも参照させたくないときnullを使う
 C 参照型を比較するときはequals()メソッドを使う
   参照型変数.equals(比較したい参照型変数);

TOPに戻る   Java講座に戻る