新年はいつもflagを立てる


ずっと技術ブログを書く習慣がなくて、今年からflagを立てて、ブログで毎週2編書くつもりです.主に最近勉強していることを総括し、記録し、反省し、知識の出力の道として、書くレベルを高めます.ではflagが来て、1年52週間、1週間2編、来年の元旦に自分が100編書いたブログを見ることができるはずです???水を漕がないで、このことをよくしてほしい.(これもhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
今日のテーマはJavaでの継承とPythonの継承の違いです
public class Test {
    public static void main(String[] args) {
        new A();
        new B();
    }
}

class A {
    int i = 7;

    public A() {
        setI(20);
        System.out.println("i from A is " + i);
    }

    public void setI(int i) {
        this.i = 2 * i;
    }
}

class B extends A {
    public B() {
        System.out.println("i from B is " + i);
    }

    public void setI(int i) {
        this.i = 3 * i;
    }
}

AはBの親で、2回のオブジェクトをインスタンス化した後、iの値はそれぞれいくらですか?
まずmainメソッドでは,2つのインスタンスオブジェクト,1つのA,1つのBをnewした.new A();の結果は簡単で、そのコンストラクション関数A()では、20をパラメータとしてsetIに渡し、そのメンバー変数iを7から40に変えて出力を印刷します.new B();文、BはAの親であるため、コンストラクション関数の呼び出し順序は親のコンストラクション関数を先に呼び出す.ここでsetIメソッドは親と子の両方に定義され、同じメソッド署名があり、メソッド書き換えに属する.したがって,親クラスのコンストラクション関数で呼び出されるのは,サブクラス書き換え後のsetIメソッドであり,伝達されたパラメータをメンバー変数iに3倍に拡大して与える.このメンバー変数iは、親定義であり、子が継承され、同じインスタンスオブジェクトに属するため、後の2回の印刷出力iの内容は一致している.
出力結果は
i from A is 40
i from A is 60
i from B is 60

pythonの継承を見てみましょう
class Person():
    def __init__(self, identity):
        print('Person class init called')
        self.identity = identity
        
    def print_grade(self):
        print(self.grade)

class Student(Person):
    def __init__(self, name, grade):
        print('Student class init called')
        Person.__init__(self, 'student')
        self.name = name
        self.grade = grade
        
s = Student('Adam','newbie')
s.print_grade()

ここでPersonはStudentの親であり,クラスの構築方法は_init__ここでjavaとは違うのは
  • 親クラスのコンストラクション関数は、アクティブに呼び出す必要があるため、呼び出さなくてもよい.
  • は、先進的な行サブクラスの構造関数であり、親クラスの構造関数を行う.
  • Person.__init__(self, 'student')この行のコードを注釈すると、親構造関数の印刷出力は消えますが、print_grade()メソッドは正常に使用できます.そこでここで推測するのは,Pythonにおける構築方法はオブジェクトを構築する役割ではなく,初期化の準備作業の役割にすぎない.
    ではJavaは?同様に、jvmがオブジェクトを作成した後、構築方法を呼び出して初期化の準備を行います.