はじめに
以前書いた「インスタンス変数、クラス変数の違い」が反響がありましたので、
(読んでくださった皆さん、本当にありがとうございます🙏)、
そちらの続編としてメソッドについて説明していきたいと思います。
インスタンスメソッド
インスタンス変数もしくはインスタンスメソッドを利用する場合に使われるメソッドです。
インスタンスという名前がついている通り、インスタンスに依存する処理を行うので、
メソッドを呼び出す前にインスタンスを作成する必要があります。
クラスメソッド
インスタンスの中身に関係なく、共通の処理を行うときに利用されるメソッドです。
インスタンスに依存せず、処理内容が不変なことから英語で「静的」という意味のstatic
をメソッドにつけます。
そのため、クラスメソッドの中ではそのクラスのインスタンス変数 or インスタンスメソッドは利用できません。(=thisを利用することはできない。)
その代わり、インスタンスに依存してないので、インスタンスを作成していなくても利用することができます。
使い分け
使い分けは至ってシンプルで、
インスタンス変数 or インスタンスメソッドをメソッド内で利用する必要があるか?
という質問に対して、
Yes(どちらか片方は必要)の場合、インスタンスメソッド
No(どちらも必要ない)の場合、クラスメソッド
を定義すればよい。
それぞれの特徴
インスタンスメソッド | クラスメソッド | |
---|---|---|
特徴 | インスタンスに依存する処理を行う | インスタンスに依存せず、共通の処理を行う |
呼び出し方 | 1.オブジェクトを代入した変数.インスタンス変数 2.this.インスタンス変数(※インスタンスメソッドを定義したクラスから作成されたインスタンスを指し示す時に使う書き方) |
1.クラス名.クラスメソッド 2.オブジェクトを代入した変数.クラスメソッド 3.クラスメソッド(※クラスメソッドの定義元であるクラスでのみ可能な書き方) |
定義 | アクセス修飾子 戻り値の型 メソッド名 | アクセス修飾子 staticキーワード 戻り値の型 メソッド名 |
this | 使える | 使えない |
オーバーライド | できる | できない |
具体例
public class Person {
private int age;
private String name;
private int birthYear;
Person (int birthYear, String name) {
this.birthYear = birthYear;
this.name = name;
this.age = this.calcAge();
}
public int calcAge() {
return 2021 - this.birthYear;
}
public void printBirthYear() {
System.out.println("あなたは" + this.birthYear + "年生まれです。");
}
public static void eat() {
System.out.println("人間は食べ物を毎日食べる");
}
}
public class Main {
public static void main(String[] args) {
Person person = new Person(1994, "Taro");
person.printBirthYear();
// 以下の2つは呼び出し方が違うだけで、実行しようとしている処理は一緒
Person.eat();
person.eat();
}
}
あなたは1994年生まれです。
人間は食べ物を毎日食べる
人間は食べ物を毎日食べる
まとめ
前回の記事と今回の記事ではJavaを使って説明しましたが、定義方法は違えど基本的な思想は他の言語でも
応用できるので、ぜひとも読んでいただければ幸いです。
次回は、thisとsuperの違い+αを記事にしようと考えております。