0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Javaのメソッドにおけるstaticやpublicの挙動を確認する

Last updated at Posted at 2019-06-06

#経緯

  • クラス自身が持つ? 公開範囲?
  • オブジェクト? インスタンス? コンストラクタ?
    • わかりにくい
    • 順を追って確認しよう

#注意

  • 「いつ使うべきか」はさておきます
  • classは全部publicで固定します

#ただのメソッド
これが一番シンプルな形
Javaはmainメソッドに修飾子がゴテゴテついていて取っ掛かりにくい気がする

Calculator.java
package jbasic;

public class Calculator {
	 int add(int number1, int number2) {
		int result = number1 + number2;
		return result;
	}
}

###ただのメソッドが使えるタイミング

メソッドが書かれたクラスのインスタンスが生成済み メソッドが書かれたクラスのインスタンスが生成されていない
パッケージが同じ ×
パッケージが違う × ×
Seller.java
package jbasic; //同じパッケージ

public class Seller {
	public static void main(String[] args) {
		Calculator calc = new Calculator();  //インスタンス生成
		System.out.println(calc.add(10,5));  //OK!
	}
}
Seller2.java
package jbasic; //同じパッケージ

public class Seller2 {
	public static void main(String[] args) {
        //インスタンス生成なし
	    System.out.println(Calculator.add(10,5));  //非staticメソッドをstatic参照するなと怒られる
	}
}

#staticメソッド
これをつけるとインスタンス化しなくてもメソッドが叩けるようになります

Calculator.java
package jbasic;

public class Calculator {
	 static int add(int number1, int number2) {
		int result = number1 + number2;
		return result;
	}
}

###staticメソッドが使えるタイミング

メソッドが書かれたクラスのインスタンスが生成済み メソッドが書かれたクラスのインスタンスが生成されていない
パッケージが同じ
パッケージが違う × ×
Seller2.java
package jbasic; //同じパッケージ

public class Seller2 {
	public static void main(String[] args) {
        //インスタンス生成なし
		System.out.println(Calculator.add(10,5));  //OK!
	}
}
Robot.java
package jmaster; //違うパッケージ

public class Robot {
	public static void main(String[] args) {
		System.out.println(Calculator.add(10,5));  //クラスをpublicにしろと怒られる
	}
}

#public staticメソッド
publicをつけると他のパッケージのクラスからメソッドが使えるようになります。

Calculator.java
package jbasic;

public class Calculator {
	 public static int add(int number1, int number2) {
		int result = number1 + number2;
		return result;
	}
}

###public staticメソッドが使えるタイミング

メソッドが書かれたクラスのインスタンスが生成済み メソッドが書かれたクラスのインスタンスが生成されていない
パッケージが同じ
パッケージが違う
Robot.java
package jmaster; //違うパッケージ

import jbasic.Calculator; //クラスのインポートは必要

public class Robot {
	public static void main(String[] args) {
		System.out.println(Calculator.add(10,5));  //OK!
	}
}

#全部public staticでよくない?

  • staticメソッドはインスタンスフィールドが使えない
  • publicだと変な使われ方をして困る時がある(という理解だけど実際の弊害が分からん)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?