#経緯
- クラス自身が持つ? 公開範囲?
- オブジェクト? インスタンス? コンストラクタ?
- わかりにくい
- 順を追って確認しよう
#注意
- 「いつ使うべきか」はさておきます
- 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だと変な使われ方をして困る時がある(という理解だけど実際の弊害が分からん)