关于javaSE继承中super的考究

在对父类非private属性的使用过程中

  1. super专门用来指代继承过来的属性,在子类没有与父类重名的情况下。实际功能与this并无二异
package gunjo.kirito.union.course;

class ManKind {
    int sex;
    int salary;

    ManKind() {
    }

    ManKind(int sex, int salary) {
        this.sex = sex;
        this.salary = salary;

    }

    public void manOrWomen() {
        if (sex == 1) {
            System.out.println("man");
        }
        if (sex == 0) {
            System.out.println("women");
        }

    }

    public void employeed() {
        if (salary == 0) {
            System.out.println("no job");
        } else {
            System.out.println("job");
        }
    }
}

class Kids extends ManKind {
    int yearsOld;

    public Kids(int age, int sex, int salary) {
        // this.yearsOld = age;
        // this.sex = sex;
        // this.salary = salary;
        /*
         * 上述赋值方法结果如下
         * women
         * job
         * 
         * 孩子年龄为:10
         * 父 or 母1
         * 父母工作1
         * 父 or 母方法
         * man
         * 父母工作否 方法
         * job
         * 
         * women
         * job
         */
        this.yearsOld = 11;
        super.sex = 1;
        super.salary = 0;
        /*
         * women
         * job
         * 
         * 孩子年龄为:11
         * 父 or 母1
         * 父母工作0
         * 父 or 母方法
         * man
         * 父母工作否 方法
         * no job
         * 
         * women
         * job
         * 
         * 由上述运行结果:super等同于专门用来指代继承过来的属性,
         * 在子类没有与父类重名的情况下。实际功能与this并无二异
         */
    }

    public void printAge() {
        System.out.println("孩子年龄为:" + this.yearsOld);
    }
}

public class TestKids {
    public static void main(String[] args) {
        ManKind m1 = new ManKind(0, 1);
        Kids k = new Kids(10, 1, 1);

        // 父类本身的
        m1.manOrWomen();// 父类正常调用 女
        m1.employeed();// 父类正常调用 有工作

        // 子类调用继承的
        System.out.println();
        k.printAge();
        System.out.println("父 or 母" + k.sex);// 1
        System.out.println("父母工作" + k.salary);// 1
        System.out.println("父 or 母方法");
        k.manOrWomen();
        System.out.println("父母工作否 方法");
        k.employeed();

        // 看看父类本身是否改变
        System.out.println();
        m1.manOrWomen();// 父类正常调用 女
        m1.employeed();// 父类正常调用 有工作
    }
}
  1. 但是,如果子类属性有与父类属性同名的情况:super专门指代继承的父类成员域,this指代子类本身的成员域,子类除了直接调用父类公共方法以外,依旧无法直接对父类本身的成员域进行修改。

详情参见:
java子类对父类继承的属性在不同修饰词下的访问权限

posted @ 2022-10-05 14:31  群青Bleu  阅读(22)  评论(0编辑  收藏  举报