これとスーパーキーワードの違い

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はどちらもオブジェクトを参照するため、静的メソッドではどちらも使用できません。

おすすめ

転載: blog.csdn.net/m0_46551861/article/details/112261242