Java super文

2399 ワード

thisとsuperは、まず初期化動作を行うため、構造関数の最初の行に置かなければなりません.
親クラスのコンストラクション関数の最初の行には、すべてのクラスの親、すなわちobjectを指す暗黙的なsuper()文もあります.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
子親クラスのコンストラクション関数:子クラスオブジェクトを初期化すると、親クラスのコンストラクション関数も実行されます.これは、子クラスのコンストラクション関数のデフォルトの最初の行に暗黙的な文があり、super()があるためです.
super()文:親クラスの中空パラメータのコンストラクション関数にアクセスします.また、サブクラス内のすべてのコンストラクション関数のデフォルトの最初の行はsuper()です.
>>なぜ子クラスは親クラスのコンストラクション関数にアクセスしなければならないのですか?
親のデータ・サブクラスは直接取得できるため、サブクラス・オブジェクトの作成時に、親がこれらのデータを初期化する方法を確認する必要があります.したがって、サブクラスはオブジェクトの初期化時に、親クラスのコンストラクション関数にアクセスします.親クラスで作成されたコンストラクション関数にアクセスする場合は、super()文を手動で定義することで指定できます.たとえば親クラスにFu(String name){}のようなコンストラクション関数がある場合、子クラスはこのようなコンストラクション関数にアクセスする際に、暗黙的なsuper()を使用して親クラスのコンストラクション関数にアクセスすることはできず、明示的なsuper(String name)文でアクセスする必要があります.親クラスが暗黙的ではない場合、サブクラスがアクセスするときにsuper文も暗黙的ではありません.
super文は必ずサブクラスのコンストラクション関数の最初の行に配置します.
結論:サブクラス内のすべてのコンストラクション関数は、親クラスの中空パラメータのコンストラクション関数にデフォルトでアクセスします.サブクラスの各構造関数内の最初の行には暗黙的なsuper()があるからです.
親クラスに空のパラメータのコンストラクション関数がない場合、サブクラスはsuperまたはthis文形式でアクセスするコンストラクション関数を手動で指定する必要があります.
もちろん、サブクラスのコンストラクション関数の最初の行は、親クラスのコンストラクション関数にアクセスするために少なくとも1つのコンストラクション関数があることを手動で指定することもできます.
abstract class Worker
{
	private String name;
	String num;
	double salary;
	Worker(String name,String num,double salary)
	{
		this.name=name;
		this.num=num;
		this.salary=salary;
	}
	public void show()
	{
		System.out.println("hello");	
	}
	public abstract void work(); 
	public String getName()
	{
		return this.name;
	}
	public void setName(String parm)
	{
		this.name=parm;
	}
}
class Emp extends Worker
{
	Emp(String name,String num,double salary)
	{
		super(name,num,salary);
	}
	public void work()
	{
		System.out.println("Emp work");
	}
}
class Employee extends Worker
{
	double bonus;
	Employee(String name,String num,double salary,double bonus)
	{
		super(name,num,salary);//            super();             super.   。
		this.bonus=bonus;
	}
	public void work()
	{
		System.out.println(this.bonus+".."+this.num);
	}
	public static void main(String[] args)
	{
		Employee e=new Employee("jhon","111",222,333);
		e.setName("Demetria");
		//e.Employee();
		e.work();
		System.out.println("
"+e.getName()); } }