【Java】コンストラクタからメンバメソッドを呼び出せる件

タイトルの通りですが、最近Javaに関することで、挙動を勘違いしていたのでブログに書いてみようと思います。

staticメソッド → メンバメソッドを呼び出した際の挙動

結論から言えば、Javaの言語仕様上、staticメソッドからメンバメソッドからを呼び出すことはできません。

public class Main {
	public static void main (String[] args) {
		// コンパイルエラー「error: non-static variable this cannot be referenced from a static context」
        this.nonStaticMethod();
	}
 
	public void nonStaticMethod() { }
}

当然ですが、staticなコンテキスト内(staticメソッド・static イニシャライザなど)では、紐付いているインスタンスがないのでthisを参照することができません。

言い換えると、thisが使えるのは、インスタンスのコンテキスト内(メンバメソッド・インスタンスイニシャライザ)だけになります。

コンストラクタ → メンバメソッドを呼び出した際の挙動

結論から言えば、タイトルの通り、呼び出すことが可能です。

class Main {
	public static void main (String[] args) {
		new Main();		
	}
	
	public Main() {
		this.nonStaticMethod();
		System.out.println("2. constructor");
	}
	
	public void nonStaticMethod() {
		System.out.println("1. nonStaticMethod");
	}
}

コンストラクタは、オブジェクトを生成するために存在するので、staticなコンテキスト内に属するかと思いきや、そうでないみたいです。

正確に言えば、staticなコンテキスト・インスタンスのコンテキスト内にも属します。
ただ、コンストラクタ → メンバメソッドを呼び出す処理を、何となくで行うと意図しないバグを生み出すことになる可能性があります。

長くなってしまったので、そこら辺については今度書いてみようと思います。

以上。