在说到super关键字之前,先介绍一下this关键字,两者对比的来学习。
this——指向当前实例对象的应用
简单的说,this就是一个指向当前实例对象的指针,this的常用方法有以下几种
- 调用当前对象的属性或者方法
- 作为返回值返回当前对象的引用
- 可以在一个构造方法内部中使用this调用另外一个构造函数
- 区别属性和局部变量
public class Demo { int num; String name; public Demo(){ num=10; } public Demo(String name) { this(); //3.调用构造函数,没有参数视为调用无参构造函数,只能出现在第一行 this.name=name; //4.this对当前对象属性的调用,区别属性和局部变量 } public void print(){ System.out.println("num="+this.num); System.out.println("name="+this.name); } public Demo addNum(){ this.num++; //1.调用当前对象的属性 return this; //2.返回当前对象的引用 } public static void main(String[] args) { Demo exp=new Demo("sdf"); exp.print(); exp.addNum().addNum().addNum().print(); //返回的当前对象再次调用addNum()方法实现累加 }
执行出来的结果是:
这里需要注意一下:在使用在构造方法内部使用this关键字调用其他的构造方法时,调用的代码只能出现在构造方法的内部的第一行可执行代码,即这样使用this调用构造方法只会出现一次。num=10 name=sdf num=13 name=sdf
在构造方法里面使用this调用其他构造方法的好处是:当构造方法比较多时,可以只书写一个构造方法的内部功能代码,然后其他的构造方法都通过调用该构造方法实现,这样即保证了所有的构造是统一的,也能够有效的降低代码的重复率,方便之后的程序修改。
super——表明当前对象的父类型的引用或者父类型的构造方法
常用方法和this类似,只不过super针对的是父类:
- 调用父类的方法或者属性
- 当父类未曾定义无参构造函数时,可以在子类的构造方法中使用super调用含参的父类构造方法。
贴上代码:
package com.LearningJava.dyp;
class Par{
int a;
/*public Par(){
a=1;
}*/
public Par(int a){
//this();
this.a=a;
}
public void Print(){
System.out.println("a="+a);
}
}
public class Demo extends Par{
int b=1;
public Demo(){
super(4); //2.调用父类有参构造函数,且该语句要放在第一行
b=0;
}
public void Print(){
super.Print(); //调用父类的Print()方法
System.out.println("b="+b);
}
public static void main(String[] args) {
Demo demo=new Demo();
demo.Print();
}
}
/
运行结果如下:
a=4
b=0
这里需要注意,如果没有使用super(4),则会报以下错误:
Implicit super constructor Par() is undefined. Must explicitly invoke another constructor
意思就是父类已经定义了有参构造方法,那么就不能调用默认的无参构造方法,所以需要在子类的构造方法中手动调用父类的构造方法。
还需注意的是:super()调用父类构造方法需要放在子类构造方法中的第一行,否则会报错,也由此可见,一个构造方法中,不能同时存在super()和this(),因为他们都是要处于第一行的位置。
再