java 中的 super

super

    super是啥? 我第一次看见这个词首先想到的是superman~~ 超人. superstar. 超级巨星. 翻译过来就是”超”. 所谓超人. 就是比人牛B那么一点点的人. 表示高一级.

那么到了程序里. 这个鬼东西是干嘛的? 原来我们讲过一个词叫this. this的作用是区分成员变量和局部变量. 对吧.

this.name = name

Ok, super的作用和this差不多. 它是区分当前类和父类中重名的问题.

调用父类中重名的内容

写个Programmer

package com.lewen.day18;

public class Programmer {
    public String name = "程序员";

}

写个 Front,此时在Front里就会有两个name. 默认用的是孙悟空的, 但是我想用hero的, 怎么办. 用super

package com.lewen.day18;

public class Front extends Programmer {
    public String name = "前端";

    public void skill() {
        System.out.println(this.name);
        System.out.println(super.name);
    }

}

测试

package com.lewen.day18;

public class Test {
    public static void main(String[] args) {
        Front fr = new Front();
        fr.skill();
    }
}

OK. 我们对super有了一个初步的认识. 说白了就是找父类中的东西.

调用父类的构造方法

接下来. 我们给父类设置一个构造方法.

package com.lewen.day18;

public class Programmer {
    public String name = "程序员";

    public Programmer(String name) {
        this.name = name;
    }
}

Front里报错了….

为什么呢? 这就涉及到一个创建对象的过程

在执行new的时候. 整个java就开始动起来, 先加载父类. 没有父类就没有子类. 对吧, 所以先加载父类, 然后加载子类. 然后. 会先执行父类的构造方法, 创建一个父类的对象 然后才是子类的构造方法. 这样一个对象才被创建出来.

package com.lewen.day18;

public class Programmer {
    public String name = "程序员";
    public Programmer(){
        System.out.println("父类的构造方法");
    }

}


package com.lewen.day18;

public class Front extends Programmer {
    public String name = "前端";

    public Front() {
        System.out.println("子类的构造方法");
    }

}

package com.lewen.day18;

public class Test {
    public static void main(String[] args) {
        Front fr = new Front();
    }
}

打印结果

父类的构造

子类的构造

    那为什么前面我们不写父类的构造的时候, 程序就不报错呢? 我们说过, java会自动送给每一个类一个构造方法, 注意, 这个构造方法是空的. 没有参数的. 所以, 前面的一切调用都是自动的.

但是, 此时我们给出了父类的构造方法. 那在创建父类对象的时候就必须要调用父类的构造方法. 但是父类中没有无参数的构造方法. 这样就必须由程序员手动去调用父类中的构造方法. 记住,. 这个是必须的.

package com.lewen.day18;

public class Programmer {
    public String name = "程序员";

    public Programmer(String name) {
        this.name = name;
    }

}

package com.lewen.day18;

public class Front extends Programmer {
    public String name = "前端";

    public void skill() {
        System.out.println(this.name);
        System.out.println(super.name);
    }

    public Front() {
        super("调用父类程序员");   // 必须手动调用父类中的构造方法, super()必须写在第一行
//        System.out.println("子类的构造方法");
    }

}

package com.lewen.day18;

public class Test {
    public static void main(String[] args) {
        Front fr = new Front();
        fr.skill();
    }
}

输出:
前端
调用父类程序员

切记, 父类如果没有无参数的构造. 子类必须手动使用super调用父类的构造方法. 来完成父类对象的创建.

super:

调用父类中重名的内容

调用父类的构造方法

posted @ 2020-01-18 17:57  前海渔文乐  阅读(216)  评论(0编辑  收藏  举报