您的位置:首页 > 编程语言 > Java开发

java中super关键字小结

2015-08-16 21:07 405 查看
在学习Java继承的相关的知识的时候,我们会遇到子类父类之间的继承关系,遇得到麻烦的向上塑形和向下塑形,自此总结一下,子父类继承关系中的super关键字的用法:

首先总结一下super关键字的作用以及注意事项:

(1)调用父类的构造器(也成构造方法),在存在子父类继承关系的时候,要实例化一个子类的对象,那么必须要首先实例化其父类,就在这时super()表现了他的作用;

(2)super()只能出现在子类的构造器中,且必须写在第一行;

(3)super()中的参数决定了,在子类对象实例化时,要调用父类的那个构造器为父类实例化;

(4)如果子类构造器中没有super()出现,那么编译器则会默认加上super()即父类的空构造器(当然这空构造器可以是系统默认产生的那个),若此时父类中没有空的构造器(即父类中声明了一个有参数的构造器,使得系统不再生成默认的构造器),那么编译就会出错;

(5)super关键字可以通过(super.父类参数)的方式来调用父类中的参数;

(6)注意,在同一个构造器中不能同时出现super关键字和this关键字!

下面是我写的一个测试的程序代码:

package com.supertest;

public class Test01 {
int a;
float b;
double c;
Test01(){
System.out.println("调用了Test01的无参数的构造器");
}
Test01(int a,float b,double c){
this.a=a;
this.b=b;
this.c=c;
System.out.println("实例化了Test01的构造方法");
}
}


package com.supertest;

public class Test02 extends Test01{
String D;
Test02(){
System.out.println("调用了Test02的无参数的构造器");
}
Test02(int k,float m,double h,String D){
super(k,m,h);
System.out.println("调用了Test02的有参数的构造器");
}
}


package com.supertest;

public class Test03 extends Test01{
public static void main(String[] args){
String G="b";
Test02 test02=new Test02(1,2,3,G);
}
}


以上的代码一方面是为了说明super关键字在,子父类继承关系中的“指向和引导”(个人总结词汇,仅供参考)作用,另外的一重的作用还有就是解决了我在写super时候常常郁闷的一个点,不知道大家看完有关super关键字的相关介绍的时候有没有留意到这样一个问题,当子类和父类的构造器都是有参数数的时候,那么子类中的那个super(参数列表)中的参数该怎么写?

在此我先坦白自己最近一直犯的一个错误,就是一味的以为super()中的参数只要是有随便声明的就好,事实肯定不是这个样子,看完上面我写的代码,也许大家就会懂了,我在写子类的有参构造器的时候,把父类的参数也同时声明在了其中,然后在super中写入了与父类有参构造器中的参数的类型相同的几个参数。然后就是愉快的编译通过了(至于中间尝试的参数形式,在此就不多叙述了,有兴趣的亲可以亲手试试),整个下来收获了知识。

我的总结是:(存在继承关系的前提下)在使用有参构造器实例化子类的对象时,需要为子类的构造器传入参数,而在子类构造器发挥作用之前,父类的构造器也要使用参数进行实例化,所以需要同时传入父类的参数的值,这也就解释了我为何要在子类的有参构造器中写入了父类构造器的参数了。(当然也可以不这么做,另外一种方式把父类有参数构造器中的参数定义为static的变量,然后在super()中将其名称写入,也可以达到一样的效果)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: