静的メソッド非表示、書き換え、継承


静的方法は、クラス名にメソッド名を付ける、クラス参照にメソッド名を付けるという2つの形式で呼び出すことができる.
上記プログラムでは、参照の種類を調べる静的方法(すなわち、クラス名に方法名を付ける方法)を呼び出すことを本質とする2つ目の方法で静的方法を呼び出す.
静的メンバー(メソッドとプロパティ)は、オブジェクトではなくクラスに属する、静的メソッド、静的プロパティ、動的プロパティは、コンパイル期間中にすでに決定する(弱々しく言えば、関連アドレスデータは仮想マシンのメソッド領域クラスデータに格納).
-------------------------------------------------------------------------
1.静的方法を継承することができる.
プログラム1:
/**
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
 * All rights reserved.
 * Author: Jarg Yee <[email protected]>
 * http://jarg.iteye.com/
 */
import static java.lang.System.out;

/**
  *                -   
  */
class SuperClass
{
	/** static method in the super class. */
	public static void display()
	{
		out.println("in the super class.");
	}
}


/*
 *                -   
 */
public class SubClass extends SuperClass
{
	/** for debugging. */
	public static void main(String[] args)
	{
		SubClass sub = new SubClass();
		sub.display();	//              
	}
}
 
--------Javaを実行する---------------
in the super class.
出力完了(0秒かかる)-正常終了
出力結果:in the super class.わかります.
sub.display(); 呼び出し子クラスは親クラスの静的メソッドを継承する.
このことから、子クラスは親クラスの静的メソッドを継承することができる.
2.静的方法が隠す書き換えられない.
プログラム2:
/**
 * Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
 * All rights reserved.
 * Author: Jarg Yee <[email protected]>
 * http://jarg.iteye.com/
 */
import static java.lang.System.out;

/**
  *                   -   
  */
class SuperClass
{
	/** static method in the super class. */
	public static void display()
	{
		out.println("in the super class.");
	}
}


/*
 *                   -   
 */
public class SubClass extends SuperClass
{
	/** for debugging. */
	public static void main(String[] args)
	{
		SubClass sub = new SubClass();		//      
		sub.display();	//            

		SuperClass sup = new SubClass();	//     
		sup.display();	//            
	}

	/** static method in the super class. */
	public static void display()
	{
		out.println("in the sub class.");
	}
}
 
--------Javaを実行する---------------
in the sub class.
in the super class.
出力完了(0秒かかる)-正常終了
動的メソッドの場合、アップコンバートオブジェクトは、サブクラスの親を書き換える動的メソッドを呼び出す.
ここでの静的メソッドについては、親クラスの子クラスに静的メソッドdisplay()が含まれている場合、アップコンバートオブジェクトが呼び出す親クラスの静的メソッドdisplay()は、子クラスで定義静的メソッドdisplay()ではない.
このことから、子クラスは親の静的メソッドを書き換えるのではなく、親の静的メソッドを非表示にし、非表示の親メソッドは親クラス名によって子クラスで呼び出すことができる.
サブクラスにおける書き換えの方法も静的である場合、実質的には親クラスの静的方法を書き換えるのではなく隠す.(Java SE 6.0プログラミングガイドP 142より抜粋)
非表示と書き換えの違いは、次のとおりです.
非表示は、参照の種類に応じて呼び出す.
書き換えは、オブジェクトの種類に応じて呼び出す.
(Java SE 6.0プログラミングガイドP 143より抜粋)
3.動的メソッドは静的メソッドを上書きできない
上記プログラム2では、サブクラスメソッドdisplay()のstatic修飾を削除すると、次のエラーが表示されます.
--------Javaコンパイル----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C:Documents and SettingsAdministratorデスクトップtestSubClass.JAva:38:SubClassのdisplay()はSuperClassのdisplay()を上書きできません.上書きされる方法はstaticです
public void display()
           ^
1エラー
出力完了(1秒かかる)-正常終了
説明:サブクラスの動的メソッドdisplay()は、親クラスの静的メソッドdisplay()を上書きできません.
4.静的メソッドは動的メソッドを上書きできない
上記の手順2では、親メソッドdisplay()のstatic修飾を削除すると、次のエラーが表示されます.
--------Javaコンパイル----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
C:Documents and SettingsAdministratorデスクトップtestSubClass.JAva:38:SubClassのdisplay()はSuperClassのdisplay()を上書きできません.上書き方法は静的
public static void display()
                  ^
1エラー
出力完了(1秒かかる)-正常終了
説明:サブクラスの静的メソッドdisplay()は、親クラスの動的メソッドdisplay()を上書きできません.
疑問:
動的メソッドは静的メソッドを上書きできない.
これはstatic修飾を加えたサブクラス動的メソッドdisplay()が親の静的メソッドdisplay()を上書きしていることを意味するのではないでしょうか.
この中のカバーは書き直す意味ではなく、隠す意味なのか.