为什么要有super
使用super调用父类的构造方法
使用super操作被隐藏的成员变量和方法
举例:
我自认为这是一个很有趣的例子,能够帮您更深入的理解super;
class Father
{
public int num = 2;
Father()
{
getNum();
}
public void getNum()
{
System.out.println("父类getNum"+this.num);
}
}
class Son extends Father
{
public int num=4;
public Son()
{
super();
super.getNum();
System.out.println("子类构造函数中"+num);
}
public void getNum()
{
System.out.println("子类getNum方法"+num);
}
}
public class Demo
{
public static void main(String[] args)
{
new Son();
}
}
这段代码的输出结果是
子类getNum方法 0
父类getNum 2
子类构造函数中 4
您感到很奇怪的应该是第一个输出结果,主要有两点:
1,为什么super()运行的是子类的getNum。
2,为什么num的值又是0
先看下这段代码的执行顺序,下面的图片是这段代码执行的顺序(很简单打debug就可以知道怎么运行了)
1,为什么super()运行的是子类的getNum。为什么num的值又是0
在第4步的时候,这个方法已经被子类覆盖了,所以执行子类的getNum方法,子类的getNum方法中,用到了num变量,这个变量在子类中也有,所以父类的num也被子类覆盖了,从代码的执行顺序可以看出,子类中对num赋值的代码,还没执行到,所以此时num的值是0,也就是编译时候的值。即执行super()时,父类构造函数中调用的方法会被子类覆盖。
2,在第7步的时候,为什么结果是这样的?
子类中super相当于父类中的this,此时super.getNum()就是父类中的getNum()。
3,为什么super必须是子类构造方法中的头一条语句?
如果super不放在第一行,对代码做一个改动;
<span style="color:#464646;">class Father
{
public int numF = 2;
Father()
{
}
}
class Son extends Father
{
public int numS=4;
public Son()
{
numS = numF;
super(); //如果把super放在这里,在执行numS=numF时,numF的值是多少?肯定不是2,父类对numF赋值的代码都没执行到。这就是为什么java设计的时候要把super放在第一行,并且是不管你是否在第一行申明了super().不申明系统也会自动帮您把它申明了。
}
}
public class Demo
{
public static void main(String[] args)
{
new Son();
}
}</span>
参考文章:
http://zhidao.baidu.com/link?url=tTFvKUDvAb3CFSm3aVA5IEyIJ7wvtczmMET0S-ZzED6uWIa2y1pSqrkLwtllpW8EVt9-fW6KPO9GeVh2I1tU4K