superキーワードとthisキーワードの違いについて


Transformerという抽象クラスを作り、それを継承するDecepticonクラスとAutobotクラスを作りました。その際、下記のコードのようにTransformer抽象クラスに作ったフィールドをDecepticonクラスとAutobotクラスのコンストラクタ内でthisキーワードを使って各々のフィールドにセットできました。しかし、thisキーワードをsuperに置き換えても上手くいきました。  
superにすると、Transformer抽象クラスのフィールドの値を書き換えているように思ったのですが、これはなぜでしょうか？  
よろしくお願いいたします。

[code]

    public abstract class Transformer {
    
      public int Strength;
      public int Intelligence;
      public int Speed;
      public int Endurance;
      public int Rank;
      public int Courage;
      public int Firepower;
      public int Skill;
    
      public abstract int calcOverall();
    
    }
    
[/code]

  

[code]

    public class Decepticon extends Transformer {
    
      Decepticon(int Strength, int Intelligence, int Speed, int Endurance, int Rank, int Courage, int Firepower, int Skill) {
        this.Strength = Strength;
        this.Intelligence = Intelligence;
        this.Speed = Speed;
        this.Endurance = Endurance;
        this.Rank = Rank;
        this.Courage = Courage;
        this.Firepower = Firepower;
        this.Skill = Skill;
      }
    
      @Override
      public int calcOverall() {
        int result = Strength + Intelligence + Speed + Endurance + Firepower;
        return result;
        }
      }
    
[/code]

  

[code]

    public class Soundwave extends Decepticon {
    
        Soundwave(int Strength, int Intelligence, int Speed, int Endurance, int Rank, int Courage, int Firepower, int Skill) {
          super(Strength, Intelligence, Speed, Endurance, Rank, Courage, Firepower, Skill);
        }
    
    }
    
[/code]




一般にクラス`A`をクラス`B`が継承するとき、単に同名のメソッドやフィールドを持つというよりは、クラス`B`がクラス`A`の **一種**
であることを示唆します。言い換えると、クラス`B`はクラス`A`と見なすこともできるということです。  
卑近な例を持ち出しますと、"動物"抽象クラスがあるとして、"犬"クラスはそれを継承するクラスとして定義できるでしょう。なぜなら"犬"は"動物"の一種であるからです。

今`Transformer`でいくつかのフィールドを定義しましたが、`Decepticon`や`Soundwave`でもそれらのフィールドが使えるのは、これらのクラスが`Transformer`の一種であるからです。あくまで`Transformer`固有の性質としてそれらのフィールドを持っているわけです。

それゆえ、`Transformer`の`Strength`、`Decepticon`の`Strength`という風に別々に管理されることはありません。それらは同じものを別の側面（それぞれのクラス）から見ているに過ぎないのです。

継承元と継承先のフィールドが「同じ」というのは次のようなコードを考えるとわかりやすいかもしれません。`B`側で設定した値が`A`側でも見えています。

[code]

    abstract class A {
        int field;
    }
    
    class B extends A {
        B(int f) {
            this.field = f;
        }
    }
    
    class Main {
        public static void main(String[] args) {
            B b = new B(42);
            System.out.println(b.field);
            // -> 42
            A a = b; // BをAとみなす
            System.out.println(a.field);
            // -> 42
        }
    }
    
[/code]




一般にクラス`A`をクラス`B`が継承するとき、単に同名のメソッドやフィールドを持つというよりは、クラス`B`がクラス`A`の **一種**
であることを示唆します。言い換えると、クラス`B`はクラス`A`と見なすこともできるということです。  
卑近な例を持ち出しますと、"動物"抽象クラスがあるとして、"犬"クラスはそれを継承するクラスとして定義できるでしょう。なぜなら"犬"は"動物"の一種であるからです。

今`Transformer`でいくつかのフィールドを定義しましたが、`Decepticon`や`Soundwave`でもそれらのフィールドが使えるのは、これらのクラスが`Transformer`の一種であるからです。あくまで`Transformer`固有の性質としてそれらのフィールドを持っているわけです。

それゆえ、`Transformer`の`Strength`、`Decepticon`の`Strength`という風に別々に管理されることはありません。それらは同じものを別の側面（それぞれのクラス）から見ているに過ぎないのです。

継承元と継承先のフィールドが「同じ」というのは次のようなコードを考えるとわかりやすいかもしれません。`B`側で設定した値が`A`側でも見えています。

[code]

    abstract class A {
        int field;
    }
    
    class B extends A {
        B(int f) {
            this.field = f;
        }
    }
    
    class Main {
        public static void main(String[] args) {
            B b = new B(42);
            System.out.println(b.field);
            // -> 42
            A a = b; // BをAとみなす
            System.out.println(a.field);
            // -> 42
        }
    }
    
[/code]

