見出し画像

Java勉強中:オブ指向と値渡し編

前に書いた記事が10日前くらいでした。しゅいろうです。朝の通勤電車で座れると、嬉しいですよね。タイトルのオブ指向は、「オブジェクト指向」が長いので省略しました(-_-;)

さて、Javaの勉強は引き続き続いています。最近はオブジェクト指向を学び始め、オブジェクト指向の言語の本髄のところを知ってるぞおとヒシヒシと感じてます。

今日も復習をかねて、まとめていきます。そうですね、「値渡しと参照渡し」、オブジェクト指向における「アップキャスト」、あとはgetterとsetterってなんだっけ?くらいを書こうかな。

値渡しと参照渡し

これは、情報の渡し方の違いらしい。値をそのまま渡すのが値渡しで、値がある場所の情報を渡すのが、参照渡し!これであなたも概要はOK!

特に参照渡しってコードで動くと感じ?と思ったので、コードがこちら👇。

public class Comic {
  public Comic() {}
  
  public int taxcalc(Book book) { //参照を受け取る。参照渡し!
    book.price = book.price + (book.price/100) * 5;
    return book.price;
  }
}

class Book {
  public int price;

  public Book(int price) {
    this.price = price;
  }
}

public class Main {
  public static void main(String[] args) {
		Comic comic = new Comic();
    Book book = new Book(1000);
   	System.out.println(comic.taxcalc(book));
    
  }
}

(クラス名は適当につけたので無かったことにして…)
注目したいのは、「public int taxcalc(Book book)」。taxcalcというメソッドの引数が、ブックブックしてますね。これは、Book型のbookという変数(というかインスタンス?)を引数に持ってきています。「参照渡し」をここでしているんだと思います。

直接参照元の情報をこれでいじれるようになるので、きちんと変更が反映されるというのが、参照渡しのメリットなんだろうなあと感じてます。まだあまりそのメリットは腹落ちして感じているわけではないですが…(笑)

アップキャスト

これは、オブジェクト指向におけるインスタンスの扱いの変更みたいな感じ。みたいな感じってすぐ言う。説明としては、子クラスから出来たインスタンスを、親クラスの型を持つインスタンスとして変換すること、なんです。

ふーん…って感じ。

けど、「キャスト」はJavaで「変換」という意味合いで使われるし、親クラスへ変換するという風に考えれば、アップキャスト(上に変換)と理解できる気がする☺。メリットとしては、「一度子クラスに継承された親クラスと共通しているメソッドを、親クラスの型として呼び出すことによって、それぞれの子クラスをいちいち呼び出さずに済む」ということだと思います。

例えば、親クラスにも、子クラスにも、「名前を表示する」メソッドがある場合、それをいちいち子クラスのインスタンスを作って~なんてしてると確かに面倒くさい可能性が高いです。子クラスが複数あったら猶更。だから、元々の親クラスにもうあるんだから、親クラスの型で「名前を表示する」メソッド呼び出せばいいということだと思いますね。

getter/setter

最初に勉強したとき、とりあえずgetなんちゃら、setなんちゃらって書いておけばいいやと思っていました。すいません。けど今はなんで必要なのかがうっすらわかってきました!

クラスには、メソッドの他に、フィールドという項目を入れるところがあるのですが、そのフィールドにprivateという言葉が付くことが多いです。privateがあると、外部からアクセス出来ないよってなっちゃいます。こまったものですね。でも、getterとsetterがあるなら、大丈夫ということです。

getterは、同クラス内のフィールドにアクセスすることができるようです。そしてsetterも。ということは、このgetter/setterを利用すれば、フィールドにprivateが付いていても、間接的にアクセスできるというわけです。まぁ便利!最初からそう言ってよーって感じです。

(先ほどのコードは、フィールドがpublic、つまり外部からアクセスできます。なので他のクラスからアクセス可能です。仮にpublicをprivateにする場合、フィールドを取得している部分を、getterメソッドにする必要が出てくるかな?と思います(-_-;))

ということで今日はここまで。また!

いいなと思ったら応援しよう!