staticメソッド
日本語 | 静的メソッド |
英語 | static method |
ふりがな | すたてぃっくめそっど |
フリガナ | スタティックメソッド |
staticで修飾されたメソッド。
「static 戻り値 メソッド名(引数){ 実装 }」のように、メソッドの宣言の先頭にstaticが付けられたメソッド。
staticメソッドは、呼び出す際にインスタンスを必要としない。
「クラス名.メソッド名()」の形式で呼び出すことができる。呼び出すstaticメソッドが自クラスにある場合には、呼び出し元のメソッドがstaticメソッド、非staticメソッドに関わらず呼び出すことができる。
通常のメソッド(非staticメソッド)は、ポリモーフィズムの関係で「インスタンス作成時に呼び出すメソッドが決められる」事もあり、メソッドの呼び出しにはインスタンスが必ず必要となる。
だが、staticメソッドはインスタンスではなく「クラスに属するメソッド」のため、インスタンスを作らずに直接呼び出すことができる。
インスタンスと関係ないため、自クラスのインスタンスに格納されている普通のフィールド(非staticフィールド)にはアクセスできず、同じく普通のメソッド(非staticメソッド)を呼び出すこともできない。staticからアクセスできるのはstaticだけ、ということになる。
また、staticメソッドはインスタンスと関係ないためポリモーフィズムとも無縁である。
ポリモーフィズムされないこともあり「staticメソッドは呼べば必ずそのメソッドが呼び出される」という分かりやすさがあるが、オブジェクト指向に逆行する考えということもあり、Javaの設計思想と異なるため、基本的にはstaticメソッドは多用しない方が良い。staticメソッドは、ポリモーフィズムやオブジェクトとは無関係な「ユーティリティメソッド」等に限った方が良い。
これとは別に、staticメソッドには「メソッド名のないstaticメソッド」が存在する。これは「static初期化子」と呼ばれるものである。詳しくは「static初期化子」の項目を参考のこと。
「static 戻り値 メソッド名(引数){ 実装 }」のように、メソッドの宣言の先頭にstaticが付けられたメソッド。
staticメソッドは、呼び出す際にインスタンスを必要としない。
「クラス名.メソッド名()」の形式で呼び出すことができる。呼び出すstaticメソッドが自クラスにある場合には、呼び出し元のメソッドがstaticメソッド、非staticメソッドに関わらず呼び出すことができる。
通常のメソッド(非staticメソッド)は、ポリモーフィズムの関係で「インスタンス作成時に呼び出すメソッドが決められる」事もあり、メソッドの呼び出しにはインスタンスが必ず必要となる。
だが、staticメソッドはインスタンスではなく「クラスに属するメソッド」のため、インスタンスを作らずに直接呼び出すことができる。
インスタンスと関係ないため、自クラスのインスタンスに格納されている普通のフィールド(非staticフィールド)にはアクセスできず、同じく普通のメソッド(非staticメソッド)を呼び出すこともできない。staticからアクセスできるのはstaticだけ、ということになる。
また、staticメソッドはインスタンスと関係ないためポリモーフィズムとも無縁である。
ポリモーフィズムされないこともあり「staticメソッドは呼べば必ずそのメソッドが呼び出される」という分かりやすさがあるが、オブジェクト指向に逆行する考えということもあり、Javaの設計思想と異なるため、基本的にはstaticメソッドは多用しない方が良い。staticメソッドは、ポリモーフィズムやオブジェクトとは無関係な「ユーティリティメソッド」等に限った方が良い。
これとは別に、staticメソッドには「メソッド名のないstaticメソッド」が存在する。これは「static初期化子」と呼ばれるものである。詳しくは「static初期化子」の項目を参考のこと。
参考サイト
- (参考サイトはありません)
// Sample.java
public class Sample
{
// staticメソッド。
public static void main( String[] args )
{
// クラスがロードされたときに、メソッド名のないstaticメソッドが実行されます。
// Sample#static
// staticメソッドをstaticメソッドから呼び出します。
staticMethod();
// Sample#staticMethod()
// staticメソッドから非staticメソッドからは呼び出せません。
// nonStaticMethod();
// コンパイルエラー:
// 型 Sample からのメソッド nonStaticMethod() は静的ではありません。
// 非staticメソッドから呼び出してみます。
Sample sample = new Sample();
sample.callingNonStaticMethod();
// 外から呼び出す際には、クラス名を使って呼び出します。
Sample.staticMethod();
// Sample#staticMethod()
// このように、インスタンスを作らなくても呼べるのが
// staticメソッドです。
// ちなみにインスタンスを通してstaticメソッドを呼び出すと
// エラーにはなりませんが警告にはなります。
sample.staticMethod();
// 警告:
// The static method staticMethod() from the type Sample should be accessed in a static way
}
/**
* 非staticメソッド(呼び出す方)。
*/
private void callingNonStaticMethod()
{
// staticメソッドを非staticメソッドから呼び出します。
staticMethod();
// Sample#staticMethod()
// 非staticメソッドから非staticメソッドを呼び出します。
nonStaticMethod();
// Sample#nonStaticMethod()
}
/**
* staticメソッド。
*/
private static void staticMethod()
{
System.out.println( "Sample#staticMethod()" );
}
/**
* 非staticメソッド。
*/
private void nonStaticMethod()
{
System.out.println( "Sample#nonStaticMethod()" );
}
}
public class Sample
{
// staticメソッド。
public static void main( String[] args )
{
// クラスがロードされたときに、メソッド名のないstaticメソッドが実行されます。
// Sample#static
// staticメソッドをstaticメソッドから呼び出します。
staticMethod();
// Sample#staticMethod()
// staticメソッドから非staticメソッドからは呼び出せません。
// nonStaticMethod();
// コンパイルエラー:
// 型 Sample からのメソッド nonStaticMethod() は静的ではありません。
// 非staticメソッドから呼び出してみます。
Sample sample = new Sample();
sample.callingNonStaticMethod();
// 外から呼び出す際には、クラス名を使って呼び出します。
Sample.staticMethod();
// Sample#staticMethod()
// このように、インスタンスを作らなくても呼べるのが
// staticメソッドです。
// ちなみにインスタンスを通してstaticメソッドを呼び出すと
// エラーにはなりませんが警告にはなります。
sample.staticMethod();
// 警告:
// The static method staticMethod() from the type Sample should be accessed in a static way
}
/**
* 非staticメソッド(呼び出す方)。
*/
private void callingNonStaticMethod()
{
// staticメソッドを非staticメソッドから呼び出します。
staticMethod();
// Sample#staticMethod()
// 非staticメソッドから非staticメソッドを呼び出します。
nonStaticMethod();
// Sample#nonStaticMethod()
}
/**
* staticメソッド。
*/
private static void staticMethod()
{
System.out.println( "Sample#staticMethod()" );
}
/**
* 非staticメソッド。
*/
private void nonStaticMethod()
{
System.out.println( "Sample#nonStaticMethod()" );
}
}
// Sample.java public class Sample { // staticメソッド。 public static void main( String[] args ) { // クラスがロードされたときに、メソッド名のないstaticメソッドが実行されます。 // Sample#static // staticメソッドをstaticメソッドから呼び出します。 staticMethod(); // Sample#staticMethod() // staticメソッドから非staticメソッドからは呼び出せません。 // nonStaticMethod(); // コンパイルエラー: // 型 Sample からのメソッド nonStaticMethod() は静的ではありません。 // 非staticメソッドから呼び出してみます。 Sample sample = new Sample(); sample.callingNonStaticMethod(); // 外から呼び出す際には、クラス名を使って呼び出します。 Sample.staticMethod(); // Sample#staticMethod() // このように、インスタンスを作らなくても呼べるのが // staticメソッドです。 // ちなみにインスタンスを通してstaticメソッドを呼び出すと // エラーにはなりませんが警告にはなります。 sample.staticMethod(); // 警告: // The static method staticMethod() from the type Sample should be accessed in a static way } /** * 非staticメソッド(呼び出す方)。 */ private void callingNonStaticMethod() { // staticメソッドを非staticメソッドから呼び出します。 staticMethod(); // Sample#staticMethod() // 非staticメソッドから非staticメソッドを呼び出します。 nonStaticMethod(); // Sample#nonStaticMethod() } /** * staticメソッド。 */ private static void staticMethod() { System.out.println( "Sample#staticMethod()" ); } /** * 非staticメソッド。 */ private void nonStaticMethod() { System.out.println( "Sample#nonStaticMethod()" ); } }