关键字super明确显式地指出一个类可以它父类的构造函数、方法和变量。
关键字super和继承一起建立类和它的父类的紧密联系。继承隐含地指出子类对父类所拥有的访问权限。例如,当我们要调用一个实例方法时,如果实例本身并没有定义该方法,那我们自然地会得到它的父类中定义的同名方法。尽管会因为方法的覆盖或者使用定义与父类一样的实例或类变量(叫做“隐藏”)而失去这种访问的权力。这就是为什么要使用super这个关键字,它显式地指出子类可以直接访问父类中的某些部分,尽管有时这种访问会因为种种原因被屏蔽了的方法在其父类中的原始代码。
关键字Super在构造函数的使用中是非常重要的,和方法不同,构造函数是不能继承的;因此super是访问父类中构造函数的惟一途径。在子类的构造函数中,使用super(...)和适当的参数表可以触发对父类构造函数的一个条用,如果父类没有相应的构造函数,编译器会报错,这就是每个实例实现的初始化的过程链。实例先把自己作为一个Object实例进行初始化,然后从它的直接子类开始按照继承链依次调用构造函数直到最后将与当前类直接相关的内容初始化完毕。
例如,下面的Frame子类定义了两个构造函数,以便与Frame类提供的两个构造函数相匹配:
class exapleframe extends Frame(){
public ExampleFrame(){
super();
}
public ExampleFrame(String title_kpwang_com){
super(title_kpwang_com);
}
//... field and method definitions
}
在这个例子中,
http://www.kpwang.com/尽管两个构造函数只有简单地调用了父类的构造函数,而没有其他什么特别之处,但是我们在使用的时候仍然要将这些语句包括进去,因为构造函数是不能自动继承的。此外,如果构造函数要调用父类的构造函数,相应的调用语句必须是新构造函数的第一条语句。
这种链式的初始化过程Java中是非常重要的,以至于如果在程序中没有给出这种调用语句,系统便会自动地将它包括进去。系统自动调用的构造函数总是不带任何参数的那一个。例如JDk中Button类包含以下构造函数代码:
/* in Button.java(JDK 1.0.2) */
public Button(String label_kpwang_com){
this.label_kpwang_com = label_kpwang_com;
}
因为父类的构造函数会被自动包括进去,所有上面的代码就等于:
/* Equivalent Button constructor: */
public Button(String label_kpwang_com){
super();
this.label_kpwang_com = label_kpwang_com;
}
系统自动调用的缺省构造函数是没有任何参数的,但是可以显式地去调用父类中任一个带参数的构造函数。
Super的第二个常见用法是一个方法中去访问父类中的同名方法,这在含有方法覆盖的方法定义中显得非常有意义。在上下文中,super允许您定义一个覆盖函数:它可以通过调用父类中的方法而不是简单地用新代码完全替换掉它的方式覆盖。AWT的Button类再一次提供了一个简单例子:
/* in Button.java(JDK 1.0.2) */
Protected String paramString(){
return super.paramString()+",label_kpwang_com="+label_kpwang_com;
}
因为Button是Component的子类,它的paramString()方法会去调用Component的paramString方法,它返回一个 String类的字符串实例来描述和所有组件有关的参数,然后将按钮的标签添加到字符串中。因此,每个按钮如果调用paramString()方法就会返回一个包括按钮尺寸,在屏幕上的位置(所有AWT组件都有的信息)和按钮标签值(特定按钮子类的信息)等信息的字符串实例。
最后,我们还可以用super去访问被子类中同名变量隐藏的父类中变量。下列代码片段就给了一个简单示例:
class X{
int foo = l;//declaree instance variable foo
}
class SubX{
int foo = 2;//declaree own version of foo, which hides the
//superclass version
int getSuperFoo(){
return super.foo;//return l,not 2
}
}
分享到:
相关推荐
主要介绍了java 关键字super详解及用法的相关资料,需要的朋友可以参考下
24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24.super关键字.zip24...
Java super关键字使用demo
java中super关键字的三种用法
ES6对象的super关键字 super是es6新出的关键字,它既可以当作函数使用,也可以当作对象使用,两种使用方法不尽相同 1.super用作函数使用的时候,代表父类的构造函数,es6规定在子类中使用this之前必须先执行一次...
前面介绍了static关键字,class类还有另外一个关键字super super不仅仅是一个关键字,还可以作为函数和对象。 函数:在子类继承父类中,super作为函数调用,只能写在子类的构造函数(constructor)里面,super代表的...
继承的概念 继承是面向对象编程中的一个概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。子类在继承父类的同时也...super关键字:对父类成员的访问;this关键字:调用自己的方法。
8. super关键字 super和this关键字访问成员的区别 static静态的上下文都是不能出现this和super的 案例代码 9.访问权限修饰符 四个修饰符的特点 10.方法的重写 方法的重写的规则 方法重写的注意事项 面试题
4、Personnel 被继承父类: 将其移至新建 package 中并在所需继承的类中添加继承关键字 extends、super() 5、course 被继承父类: (1)设定编号、课程名称、上课地点、时间、教授老师属性 (2)编写构造方法,使...
博文链接:https://gml520.iteye.com/blog/129124
javathis和super用法 this和 super 关键字的区别
想要下载此文件,请先下载本人“java程序中的内存分配问题”,因为那个例子比较简单而且分析详细透彻,可以使你更容易理解,如果你对java程序执行过程中的内存分配有一定的了解,可以直接下载本文件
在创建自己的异常时:所有异常都必须是Throwable的子级。如果该方法覆盖其超类的方法之一,则可以通过使用关键字super来调用覆盖的方法。当使用父类引用来引
详解Java super 关键字
文章目录继承常用的关键字this关键字static关键字super关键字final关键字封装及权限修饰符封装的作用及其优点权限修饰符封装的使用细节多态多态的概念多态的使用要点对象的转型instanceof运算符类型自动提升及强制...
super这个关键字,既可以当作函数使用,也可以当作对象使用。在这两种情况下,它的用法完全不同。 1、当作函数使用 class A {} class B extends A { constructor() { super(); //ES6 要求,子类的构造函数必须...
关键字super/this的用法和区别;在继承中子类和父类构造方法的关系;方法重写;final关键字
原创讲述关于linux文件系统的追踪关键字super block node block这三个关键词。重点讲述了ext2文件系统
主要介绍了Java super关键字用法,结合具体案例形式分析了java super关键字调用父类构造方法、属性及方法等相关操作技巧与注意事项,需要的朋友可以参考下
文章目录继承super关键字ES6中的类和对象的4个注意点:总结 继承 程序中的继承: 子类可以继承父类的一些属性和方法 class Father { //父类 constructor () { } money () { console.log(100) } } class Son ...