java中super关键字的用法,简要叙述java中super关键字的作用
一.定义二应用2.1应用范围2.2用法2.2.1在子类中调用父类的属性或方法2.2.2引用子类中的父类构造函数附:super的实际例子总结。本文主要讨论super关键字,它在Java中的角色和用法。
00-1010它是一个引用变量,用于引用子类中的父类对象。
目录
00-1010只能用于子类的构造函数和实例方法,不能用于子类的类(静态)方法。原因是super指的是父类的一个对象,需要在运行时创建,而静态方法是类方法,是类的一部分。加载类时,方法已经存在,但此时父类对象尚未初始化。
00-1010 Java中super有两种使用场景。
00-1010调用子类中父类的属性或方法。尤其是如果一个子类和父类有相同的属性或方法,那么如果你想调用父类的属性或方法,就必须使用super关键字。因为子类中的属性或方法与父类中的属性或方法同名,所以父类中的方法或属性将被覆盖或隐藏。Super可以引用父类中的类属性和类方法,但不建议这样做。虽然不会给出错误,但是说明你对static关键字了解不够。请仔细复习并理解静态关键字。
Classparent {publicstring name=小爸爸;public boolean hasMoney=falsevoid sleeping(){ system . out . println(爸爸已经睡觉了);} public void working(){ system . out . println(爸爸在工作。);}} public class child扩展parent {public string name=大头儿子;/* * *当子类和父类的属性名相同时,需要super调用父类的属性。*直接调用将调用子类的属性。*如果没有重名,可以直接调用,是父类的属性。*/privatevoid test param(){ system . out . println(爸爸的名字是 super . name );System.out.println(孩子的名字是名字);System.out.println(爸爸有钱吗: has money );}/* * *方法同上property result */public void test method(){ sleeping();super . sleeping();super . working();} public void sleeping(){ system . out . println(我儿子已经睡觉了);} public static void main(String[]args){ Child Child=new Child();child . test param();child . test method();}}测试结果:
=============
爸爸的名字叫小头爸爸的名字叫大头儿子。爸爸有钱吗?儿子已经睡觉了,父亲也已经睡觉了。
爸爸在工作。
============
00-1010在Java中,子类是父类的派生类,它的实例化依赖于父类的实例化。所以它的任何一个构造函数都必须初始化父类,Java是调用父类构造函数完成这个操作的超级关键字。
有人会奇怪,为什么在2.1.1的例子中,父类没有构造函数,子类也没有构造函数。在某些情况下,实例的初始化不依赖于构造函数。
是的,实例的初始化必须需要一个构造函数。2.2.1之所以没有构造函数,是因为在Java类定义中,如果开发者没有显示的定义构造函数,那么Java会隐式地为类定义一个无参数的构造函数。但是,如果开发人员定义了一个构造函数(带或不带参数),那么Java不会隐式地为这个类定义一个无参数的构造函数。
然后是恢复构造函数后的代码:
公共类父级{.
public Parent() { } ...} public class Child extends Parent { ... public Child() { } ...}那么又有人有奇怪了,你不是说子类的实例化依赖于父类的实例化,那么在子类的构造函数中应该需要调用super来初始化父类不是吗?
是的,在我们子类的构造函数中,如果我们没有显式调用super来初始化父类的话,那么Java会隐式的调用super();来调用父类无参构造函数并把它放在构造函数的第一行。记住哦,Java只会隐式的调用无参构造函数,如果父类没有无参构造函数,那么子类中就必须显示的调用super关键字来调用已有的有参构造函数来初始化父类。
public class Parent { public String name = "小头爸爸"; public Parent(int age) { } public void sleeping(){ System.out.println("爸爸已经睡了"); }} public class Child extends Parent { public String name = "大头儿子"; public Child() {//如果没有super来初始化父类,同样也会报错// super();//编译期报错,因为父类并没有无参构造函数 super(15);//正确打开方式 } private void printParentName(){ System.out.println("爸爸的名字叫" + super.name); } private void parentStatus(){ super.sleeping(); }}
子类中的super为什么必须要放在第一行?因为子类的实例化依赖于父类的实例化,在构建子类时,必须要有父类实例,只能有了父类的实例,子类才能够初始化自己。就好像人类世界里,都是要先有父亲,再有孩子一样。
附:super实际使用示例
下面来看看super关键字的实际用法。 在这里,Emp类继承了Person类,所以Person的所有属性都将默认继承到Emp。 要初始化所有的属性,可使用子类的父类构造函数。 这样,我们重用了父类的构造函数。
class Person { int id; String name; Person(int id, String name) { this.id = id; this.name = name; }}class Emp extends Person { float salary; Emp(int id, String name, float salary) { super(id, name);// reusing parent constructor this.salary = salary; } void display() { System.out.println(id + " " + name + " " + salary); }}class TestSuper5 { public static void main(String[] args) { Emp e1 = new Emp(1, "ankit", 45000f); e1.display(); }}
结果如下:
1 ankit 45000
总结
super关键字指代父类对象,主要用于在子类中指定父类的方法和属性,也用于在子类中初始化父类。子类的静态方法中不能使用super关键字。
到此这篇关于Java基础之super关键字的文章就介绍到这了,更多相关Javasuper关键字内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。