Java キーワードの詳細な説明

序文(ナンセンス文学)

非常に体系的で公式なテキストの紹介文をたくさん読みましたが、理解するのに時間がかかるので、super が何に役立つのかをまとめ、コードのデモも公開します。ここで使用する IDE は idea です。

序文 (定義)

公式にしましょう

Java では、super はスーパークラス (つまり、一般に親クラスと呼ばれるもの) を意味します。サブクラスが親クラスのフィールドを参照する必要がある場合は、super.FieldName を使用できます。



したがって、この記事では、コンストラクター、パブリック メンバー関数、およびパブリック メンバー変数からの super の役割を説明します。プライベート プライベート メンバーはそれ自体でのみ使用できるため、スーパーがパブリック メンバーに影響を与えないこともここでわかります。継承関係のフィールド。

super()の構築方法

親クラス (スーパークラス) にデフォルトのコンストラクターがない場合、サブクラスは明示的に super() を呼び出し、親クラスのコンストラクターのパラメーターを使用する必要があります。

什么意思呢?
就是有一个父类Parent,子类Son,如果我们在Parent中定义了构造函数,那么在继承父类的子类中就必须书写父类的构造函数。那么此时就需要将super()写在子类构造方法中。
如果父类中没有定义构造方法,那么编译器会默认是public Parent(){}就是空的,此时在子类中不书写super也不会报错,因为编译器默认生成子类构造方法为空,super()就默认是隐藏的。
就是构造函数必须有super(),(开个玩笑:你说那我看到的有的咋没有,不是没有,只是只有聪明人能看见嘿嘿嘿。)如果子类中没有super(),那是因为编译器替你干了这个活,它隐藏了super()这个默认的无参构造方法,算是隐式调用。
注意显式二字。

これが来ます、コードサンプルが来ます

父親

public class Parent {
    
    
    //public Parent(){}//可以不写,编译器会默认是它,空的
    // 为了查看效果,我们把父类无参构造函数里加个输出
    public Parent(){
    
    
        System.out.println("This is Parent!");
    }
}

サブクラス

public class Son extends Parent{
    
    
    public Son(){
    
    //此时不写super也不会报错,因为编译器默认是有super(),只不过隐藏了。
        System.out.println("This is son!");
    }
}

MyMain.java

public class MyMain {
    
    
    public static void main(String[] args){
    
    
        Son son = new Son();
    }
}

効果を見てみましょう。親クラスのコンストラクターも実行されていることがわかります。したがって、 super() は、親クラスのメソッドを呼び出すことを意味します。多くの場合、最初にパラメータを渡すことで、必要な結果が得られます。
1
次に、親クラスのコードを次のように変更します。

public class Parent {
    
    
	public Parent(String name,int id){
    
    
	        System.out.println(name+"  "+id);
	    }
}

サブクラスのコードは次のとおりです

public class Son extends Parent{
    
    
    public Son(String name,int id){
    
    
        System.out.println("This is son!");
    }
}

MyMainクラスのコードは次のとおりです

public class MyMain {
    
    
    public static void main(String[] args){
    
    
        String name ="Bob";
        int id=12;
        Son son = new Son(name,id);
    }
}

ダンダン、エラーが報告されました。なぜ、スーパーを書かなかったのですか。デフォルトの非表示スーパーは super() であり、パラメーターを渡さないため、サブクラスが親クラスを継承する場合、親クラスのコンストラクターを適用できません。サブクラスの真ん中。
java: 无法将类 Parent中的构造器 Parent应用到给定类型;

1
サブクラスのコードを次のように変更し、他の部分は変更しないで、実行できることを確認します。これは、親クラスと一貫性のある String パラメーターと int パラメーターが渡されているためです。したがって、 super() は、サブクラスが使用することを意味します。親クラスのコンストラクター (つまり、関数名とパラメーターが同じである必要があるため、サブクラスは親クラスの関数をオーバーロードします)、コンストラクターに他のロジックを追加することもできます。

public class Son extends Parent{
    
    
    public Son(String name,int id){
    
    
        super(name, id);
        System.out.println("This is son!");
    }
}

1

super() のメンバー関数

継承可能なメンバー関数の場合、サブクラスが親クラスのメソッドをオーバーライドしながら親クラスと同じメソッドを呼び出す (実装する) 場合は、 super.func(obj, obj,...) を使用します。コンストラクターとは異なり、super.func() を関数の先頭に配置する必要はありませんが、コンストラクターの super() は関数本体の先頭に配置する必要があります。

ここに来て、コード例、
親クラスが来ます

public class Parent {
    
    
    private String name="Pang pang";
    private int id=12;
    private String selfIntro="This is a fat parent";
    public Parent(){
    
    }
    public void getName() {
    
    
        System.out.println(name);
    }
    public void getId(){
    
    
        System.out.println(id);
    }
    public void getSelfIntro() {
    
    
        System.out.println(selfIntro);
    }
}

サブクラス

public class Son extends Parent{
    
    
    private static String sonIntro="This is Feifei's child";
    public Son(){
    
    System.out.println("This is Son:");}

    @Override
    public void getSelfIntro() {
    
    
        System.out.println(sonIntro);
        System.out.println("I want to see my parents' introduction: ");
        super.getSelfIntro();//可写可不写,只是看子类想不想调用它,它可以放在任何想调用的位置,返回的是父类的介绍
        //如果子类想调用却不写super的话就会报错
    }
}

メインクラス

public class MyMain {
    
    
    public static void main(String[] args){
    
    
        //从子类读取信息
        Son son = new Son();
        son.getSelfIntro();
    }
}

これを結果表示で見る
1
と、パラメータを持つメンバー関数が完了したらどうなるのか、はい、どうやって完了するのか、と疑問に思うはずです。実際、サブクラスの優先順位の原則により親クラスのデータが上書きされるため、通常、パラメーターを渡す必要がある場合には super は呼び出されないことがわかります。たとえば、以下にそれを示します。もちろん、一部のパラメーターが影響を受けない場合でも、親クラスのパラメーターを含むメンバー関数を呼び出したい場合は super を呼び出すことができます。

父親

public class Parent {
    
    
    private String name;
    private int id;
    public Parent(){
    
    }

    public void setInfo(String name,int id){
    
    
        this.name=name;
        this.id=id;
    }
    public void getInfo(){
    
    
        System.out.println(name+"  "+id);
    }
}

サブクラス

public class Son extends Parent{
    
    
    private String name;
    private int id;
    public Son(){
    
    }
    @Override
    public void setInfo(String name,int id){
    
    
        super.setInfo(name,id);//将值传递给父类
        this.name=name;
        this.id=id;
    }
    @Override
    public void getInfo(){
    
    //打印信息
        System.out.println("This is parents' information:");
        super.getInfo();
        System.out.println("This is son's information: ");
        System.out.println(name+"  "+id);
    }
}

メインクラス

public class MyMain {
    
    
    public static void main(String[] args){
    
    
        //由于子类优先原则,会将所有的值由子类传递给父类,顺便演示一下子类优先原则
        //设置父类信息
        Parent parent=new Parent();
        String pName="Pang pang";
        int pId = 11;
        parent.setInfo(pName,pId);
        System.out.println("This is first parent:");
        parent.getInfo();//打印出来看看,此时还是很正常的父类的值
        //设置子类信息,会发现父类信息失效了
        Son son = new Son();
        String sName = "Fei fei";
        int sId = 15;
        son.setInfo(sName,sId);
        son.getInfo();
    }
}

1

super()のメンバー変数

親クラスのメンバー変数には、サブクラス内で super. 変数名を使用してアクセスできますが、アクセスできるのはプロテクトおよびパブリックのメンバー変数のみであり、プライベート変数のサブクラスにはアクセスできません。

父親

public class Parent {
    
    
    private String inf1 = "Parent: stupid!";
    protected String inf2 = "Parent: Kids!";
    public String inf3 = "Parent: eat!";

}

サブクラス

public class Son extends Parent{
    
    
    private String inf1;
    protected String inf2;
    public String inf3;
    public Son(){
    
    }
    public void setInfo(String inf1,String inf2,String inf3){
    
    
        this.inf1=inf1;
        this.inf2=inf2;
        this.inf3=inf3;
    }
    public void getInfo(){
    
    //打印信息
        System.out.println("This is son's information: ");
        System.out.println(inf1);
        System.out.println(inf2);
        System.out.println(inf3);
        System.out.println("This is parents' information:");
        //System.out.println(super.inf1);
        System.out.println(super.inf2);
        System.out.println(super.inf3);
    }
}

メインクラス

public class MyMain {
    
    
    public static void main(String[] args){
    
    
        //设置子类信息
        Son son = new Son();
        String ss1 = "Son: mom!";
        String ss2 = "SOn: sorry!";
        String ss3 = "Son: play!";
        son.setInfo(ss1,ss2,ss3);
        son.getInfo();

    }
}

実行結果
1
プライベート変数が呼び出されると、次の図に示すようにエラーが報告されます。
1

結論

序文にまとめがあり、超分析はここで完了となりますので、ご不明な点、ご質問等ございましたら、ご指摘ください。

おすすめ

転載: blog.csdn.net/qq_43738932/article/details/126637221