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关键字!
下面是我写的一个测试的程序代码:
以上的代码一方面是为了说明super关键字在,子父类继承关系中的“指向和引导”(个人总结词汇,仅供参考)作用,另外的一重的作用还有就是解决了我在写super时候常常郁闷的一个点,不知道大家看完有关super关键字的相关介绍的时候有没有留意到这样一个问题,当子类和父类的构造器都是有参数数的时候,那么子类中的那个super(参数列表)中的参数该怎么写?
在此我先坦白自己最近一直犯的一个错误,就是一味的以为super()中的参数只要是有随便声明的就好,事实肯定不是这个样子,看完上面我写的代码,也许大家就会懂了,我在写子类的有参构造器的时候,把父类的参数也同时声明在了其中,然后在super中写入了与父类有参构造器中的参数的类型相同的几个参数。然后就是愉快的编译通过了(至于中间尝试的参数形式,在此就不多叙述了,有兴趣的亲可以亲手试试),整个下来收获了知识。
我的总结是:(存在继承关系的前提下)在使用有参构造器实例化子类的对象时,需要为子类的构造器传入参数,而在子类构造器发挥作用之前,父类的构造器也要使用参数进行实例化,所以需要同时传入父类的参数的值,这也就解释了我为何要在子类的有参构造器中写入了父类构造器的参数了。(当然也可以不这么做,另外一种方式把父类有参数构造器中的参数定义为static的变量,然后在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()中将其名称写入,也可以达到一样的效果)
相关文章推荐
- Java 对象
- Java多重循环算法问题:(九九乘法表、打印平行四边形、打印空心菱形、打印菱形、搬砖问题、斐波那契数列、猴子吃桃问题、回文数、1!+2!+...+20!)
- 自定义spring schema简化与canal集成
- JavaEE SSH集成框架(两) struts2 本地加载dtd文件,action组态
- java中IO流学习小结
- java 基础(环境变量、)
- JAVA IO操作关键点
- Java类的生命周期详解
- Spring用法快速入门
- Java:多重循环for、while、do-while(简单判断是否是四位整数、1-100累加,水仙花、最大公约数。最小公倍数、完数、输入任意数计算每位数之和、弹力球问题)
- Java内存分配全面浅析
- eclipse中的dynamic web project与Static Web Project 的区别
- Java中循环问题:for,while,do-while 各种练习(打印上三角、下三角、输出100以内的素数、水仙花、最大公约、最小公倍数、分解质因数、兔子问题)
- 浅析Spring事务传播行为和隔离级别
- Spring配置简化
- struts2学习笔记(十三)文件下载
- 深入理解java的static关键字
- java中堆与栈的区别
- hdu 1131 Count the Trees Java 大数
- 初学Java,粗浅看待数据类型与运算符中需要注意的问题