1.thisキーワードとsuperキーワード
の違い1.なぜsuperを使用するのですか?
子クラスは、親クラスのメソッドまたは変数にアクセスしようとしています。
サブクラスは、親クラスの構築メソッドを呼び出します。
this:
このキーワードは、メソッドのメソッド本体でのみ使用でき、「メソッドを呼び出すオブジェクト」への参照を表します。オブジェクトが作成されると、Java仮想マシン(JVM)は、それ自体を参照するオブジェクトにポインターを割り当てます。このポインターの名前はthisです。したがって、これはクラスの非静的メソッドでのみ使用でき、静的メソッドおよび静的コードブロックに表示されてはなりません。
super:
superキーワードはこれに似ており、非表示の親クラスのメンバー変数とメンバーメソッドを表示したり、非表示の親クラスのメンバー変数とメンバーメソッドを参照したりするために使用されます。
二、使用シナリオ:
1.使用し、スーパーやメンバ変数やメソッドを呼び出すために、この
親クラスのメンバー変数またはメソッドと同じ名前のサブクラスのメンバー変数またはメソッドに遭遇することがあります。サブクラスのメンバー変数またはメソッド名の優先度が高いため、サブクラス内の同じ名前のメンバー変数またはメソッドは、親クラスのメンバー変数またはメソッドを非表示にするため、superが必要です。コードが読めないので、自分で理解してみてください
class Country{
String name;
void value() {
name = "china";
}
}
public class City extends Country{
String name;
void value() {
name = "Xian";
super.value();
//不调用此方法时,super.name返回的是父类的成员变量的值null
System.out.println(name);
System.out.println(super.name);
}
public static void main(String[] args) {
City c=new City();
c.value();
}
}
//运行结果:
//Xian
//china
サブクラスの親クラスのメンバー変数名とメソッドvalue()を参照するために、コードではsuper、super.name、super.value()が使用されます。super.value()が呼び出されない場合、super.nameは親クラスのメンバー変数のデフォルト値をnullに返します。このメソッドが呼び出されると、super.value()メソッドはメンバー変数名を中国に割り当てます。次に、super.nameを使用して、親クラスのメンバー変数の値を呼び出します。さらに、super.nameは親クラスのメンバー変数の値を呼び出すことに注意してください。
class Country{
String name="shanxi";
String value(String name) {
name = "china";
return name;
}
}
public class City extends Country{
String name;
String value(String name) {
name = "Xian";
super.value("失败");
//不调用此方法时,super.name返回的是父类的成员变量的值null
System.out.println(name);
System.out.println(super.name);
return name;
}
public static void main(String[] args) {
City c=new City();
c.value("成功");
}
//Xian
//shanxi
現時点では、super.nameによって返される値は、親クラスのメンバー変数の値shanxiであり、この時点でのsuper.value()メソッドは機能しません。
2. superとthisを使用して、コンストラクターを呼び出します
class Person{
public static void prt(String s){
System.out.println(s);
}
Person(){
prt("A Person");
}
Person(String name){
prt("A Person name is:"+name);
}
}
public class Chinese extends Person{
Chinese(){
super();//调用父类的无参构造方法(1)
prt("A chinese");//(4)
}
Chinese(String name){
super(name);//调用父类具有相同形参的构造方法(2)
prt("his name is:"+name);
}
Chinese(String name,int age){
this(name);//调用当前子类中具有相同形参的构造方法(3)
prt("his age is:"+age);
}
public static void main(String[] args) {
Chinese cn=new Chinese();
cn=new Chinese("zhiwen");
cn=new Chinese("zhiwen",38);
}
//A Person
//A chinese
//A Person name is:zhiwen
//his name is:zhiwen
//A Person name is:zhiwen
//his name is:zhiwen
//his age is:38
このコードでは、thisとsuperは、以前のように「。」でメソッドまたはメンバーに接続されなくなりましたが、適切なパラメーターが直接続くため、その意味も新しい変更になります。superの後にパラメーターを追加すると、(1)や(2)など、親クラスで同じ形式のパラメーターを呼び出すために使用される構築メソッドが示されます。この後にパラメーターを追加すると、(3)のように、同じ仮パラメーターを持つ現在のクラスのコンストラクターが呼び出されます。もちろん、中国語のさまざまなオーバーロードされた構築方法では、(4)のようにthisとsuperの一般的な使用法を引き続き使用でき、「this.prt」に置き換えることができます(親クラスのprtを継承するため)メソッド)または「super.prt」を使用する(これは親クラスのメソッドであり、サブクラスからアクセスできるため)、彼は引き続き実行できますが、これは少し不必要に思えます。
3.サブクラスの構築メソッドでsuperを参照する場合は、メソッドの最初の行にsuperを配置する必要があります。
class Base{
Base(){
System.out.println("Base");
}
}
public class Checket extends Base{
Checket(){
super();//调用父类的构造方法,一定要放在这个方法的首个语句
System.out.println("Checket");
}
public static void main(String[] args) {
Checket c=new Checket();
}
//Base
// Checket
}
スーパーを使用して親クラス構造のメソッドを呼び出したいが、それが最初の行に配置されていない場合、スーパーの前のステートメントは、特定の動作を完了したいステートメントである必要がありますが、スーパーを使用して構造を呼び出します親クラスのメソッドの場合、以前に行われたすべての変更は前に戻ります。つまり、親クラスの構築メソッドになります。
要約:
1。他のコンストラクターを呼び出すために同じコンストラクターに同時に表示することはできません
super(パラメーター):親クラスの特定のコンストラクターを呼び出します。これはコンストラクターの最初のステートメントである必要があります。
this(パラメーター):このクラスで別の形式の構築メソッドを呼び出します。これは、構築メソッドの最初のステートメントである必要があります。
this()とsuper()は、必然的に他の構築メソッドを呼び出すため、同じ構築メソッドに同時に表示することはできません。また、他の構築メソッドにはスーパーステートメントが必要であり、同じ構築メソッドの同じステートメントは次のようになります。 lostステートメントの意味が変更された場合、コンパイルはパスしません。
2.コンストラクターの呼び出しの違い:
super:は、現在のオブジェクトの直接の親クラスのメンバーを参照し、直接の親クラスの非表示のメンバー変数またはメソッドにアクセスするために使用されます。これは、親クラスとサブクラスが同じメンバー(スーパー変数名やスーパーメンバーメソッド名(実際のパラメーター)など)を持っている場合に使用されます。
this:現在のオブジェクトの名前を表します。プログラムであいまいさが発生する可能性があります。これは、現在のオブジェクトを示すために使用する必要があります。メソッドの形状が同じ名前のクラスのメンバー変数に参加している場合、これはメンバー変数名を示すために必要です。
3.前提条件が異なります
。superキーワードは、使用する前に継承する必要があります。thisキーワードは、継承
なしで使用できます。
4.その他:
super()の呼び出しは、サブクラス構築メソッドの最初の行に記述する必要があります。そうしないと、コンパイルはパスしません。各サブクラスの構築メソッドの最初のステートメントは、super()の暗黙的な呼び出しです。親クラスにその
ような構築メソッドがない場合、コンパイル中にエラーが報告されます。
thisとsuperはどちらもオブジェクトを参照するため、静的メソッドではどちらも使用できません。