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:
调用父类中重名的内容
调用父类的构造方法