this的HXD“super”关键字
我们都知道java中的关键字this来解决重名的问题,即 this.属性 或者 this.方法 的方式来处理同名问题,这是我们显示的使用该关键字。那是因为它一直都在属性或者方法前悄咪咪的待着,只不过不同名时,它不露头而已。最近,我发现个神奇的关键字,它居然和this神似,但是又有所不同,它就是super关键字。
一.super的理解(以及super调方法和属性)
1.super的作用:可以用来区分重写与重写后的类
2.super的使用范围:属性,方法,构造器
3.使用方式:super.属性 / 方法 / 构造器
4.super的说明:
第一点:在有子类的类中,通常用super.属性或者super.方法的方式显式的调用父类中声明的属性和方法,但是通常会忽略super和this(好兄弟一起说,嘿嘿)
第二点:特别的,当父子类中定义了同名的属性时,我们要存子类中调用父类中的属性时,必须使用super.属性名(表示来自父类的)
第三点:方法和属性一样都符合第二点说明的。
如下例子:
父类:
public class hero{
int age;
String name="JACK";
boolean ismale;
public hero(){
}
public hero(String name1, String abi){
System.out.println(name1+"的能力是"+abi);
}
public void achievement(){
System.out.println("我外星人干掉了");
}
}
子类:
public class superman extends hero {
String wuqi;
String name="TOM";
public superman(){
}
public void achievement(){
System.out.println("我已经干掉100个外星人了");
}
public void show(String wuqi){
this.wuqi=wuqi;
System.out.println("他的名字是:"+name+"\t"+"我的名字是:"+super.name);
}
}
最后测试:
public class ishero {
public static void main(String[] args) {
superman king=new superman();
king.show("猫和老鼠");
}
}
最后我们发现,结果是:
他的名字是:TOM 我的名字是:JACK
经过回头查看可以看出来,加了super哪一个name输出的名字是父类中的属性,而不是子类中的。(这是属性,方法也类似)
二.super调用构造器
首先,注意点提前说明:
1.我们可以在子类的构造器中显示的使用”super(形参列表)“的方式来调用父类中声明的指构造器。
2.super(形参列表)必须使用在首行,否则无效。
3.this和super二者只能同时用一个,一山难容二虎。
4.当我们在未在构造器中用这俩兄弟时候,则系统会默认为super()的形式。
5.在类的多个构造器中,一定有super()的构造器,去调用父类中的构造器。
如下例子:
父类:
public class hero{
int age;
String name="JACK";
boolean ismale;
public hero(){
System.out.println("无处不在");
}
public hero(String name1, String abi){
System.out.println(name1+"的能力是"+abi);
}
public void achievement(){
System.out.println("我外星人干掉了");
}
}
子类:
public class superman extends hero {
String wuqi;
String name="TOM";
public superman(){
}
public void achievement(){
System.out.println("我已经干掉100个外星人了");
}
测试:
public class ishero {
public static void main(String[] args) {
superman king=new superman();
}
}
结果是:
无处不在
如此可见,虽然我们创建的是superman的对象,但是我们会得到父类构造器中的无处不在,由此可见,superman类中的构造器用了super(),其实,类中的第一空构造器的另一种写法是:
public superman{
super();
}