【Oracle Java Bronze,Silver対策】マジでわからなくなってくる、クラス型変数の扱い

2019年12月15日

クラスのオブジェクト化やメソッドの扱い方は数多くの書籍に書いてあり、それを読むことで理解ができます。

しかし、実際にJavaのBronzeやSilverの問題を見るとそれよりも複雑で難しく感じることがあります。

特にわかりにくいのクラス型変数の扱いです。特にメソッドの引数にクラス型変数が入った場合の動きが難しく、なんでそういう結果がコンソールに表示されるのか、理解をするのに時間がかかりました。

BronzeやSilverの試験でこの問題を解くために、少し易しい例を見て頭の回路を構築していきます。

尚、基本的なクラスやメソッドの扱い方はこちらの記事で紹介しています

【PR】プログラミングスクール【PR】独学で挫折しそう、やっぱり難しい、手早く学びたい。そんな人にはやはりプログラミングスクールがお勧めです。

【プログラミングスクールを利用するメリット】

JavaはWebアプリケーションなどを作ることができるプログラミング言語です。しかし、独学だと基本事項からなかなか抜け出せず、アプリを作るイメージができずに挫折してしまう人も多いです。紹介する二つのプログラミングスクールのJavaコースはWebアプリケーションを作ることを前提にカリキュラムが組まれていますので、より実用的な内容を学ぶことができます。

 

おすすめ1▶TechAcademy
Javaコース

おすすめ1▶CodeCamp
Javaマスターコース

次のコードを見てください

実行結果


どうしてこのような結果になるのか、丁寧に後を追ってみます。

まず、3行目、4行目で「松オブジェクト」「竹オブジェクト」が生成され、コンストラクタでそれぞれのString型matsu、takeに「松」「竹」が代入されます。その後、printlnメソッドでmatsu、takeの値を出しているのでここは「松(改行)竹」が表示されます。ここまでは大丈夫ですよね。念のため①~⑥まで振って追えるようになっていますので確認してください。

次からが本題です。8行目のt.useMatsu(m)のところを説明していきましょう。

t.useMatsu(m)は「竹オブジェクトのuseMatsuメソッドを使用します」という意味です。竹クラスのメソッドを確認すると22行目に「void useMatsu(Matsu m)」という部分があるので、この部分が呼び出されることがわかります。

useMatsuメソッドの処理内容を見てみましょう。

m.matsu = take」という処理内容になっています。これはsetterのようなものであり、右辺の変数takeの値を変数matsuに格納するという処理になります。変数takeは自オブジェクトである竹オブジェクトにString型で定義されており、「竹」が格納されています。

ここで、変数matsuに「竹」を格納するのですが、「m.matsu」とあるように、変数matsuは松オブジェクトの変数です。

別オブジェクトの変数は基本的には操作ができません。そこで出てくるのが、クラス型変数を引数にしたメソッドです。

useMatsuメソッドを見ると、「useMatsu(Matsu m)」となっており、Matsu型の変数を引数とするように指定しています。Matsu型の変数というのは、ここでいうと「m」ですよね。useMatsuメソッドの呼び出し元を見ると「useMatsu(m)」となっています。

こうするとどういうことが起きるかというと、竹オブジェクトの中で松オブジェクトが参照できるようになります。つまり、useMatsuメソッドの中でMatsuメソッドの変数matsuが操作できるようになります。

このようにして、useMatsuメソッドの中の処理内容である{m.matsu = take;}で松オブジェクトの中の変数matsuを竹に変えられています。こんなことができるのは、useMatsuメソッドの引数がMatsu型だからです。

複雑そうに見えますが、こうして整理していくと意外と簡単な話だなと思います。

ただ、色々と問題を解いていくと途中で混乱したりするんですよね。問題数をこなしていく中で徐々にわかるようにしていくものだと思います。

最後に、実行されるコードの順番を記したコードを紹介します。

以上、クラス型変数の扱いの話でした。