原文

一、定义

它是一个指代变量,用于在子类中指代父类对象。

二、应用

2.1 应用范围

只能用于子类的构造函数和实例方法中,不能用于子类的类(静态)方法中。原因是super指代的是一个父类的对象,它需要在运行时被创建,而静态方法是类方法,它是类的一部分。当类被加载时,方法已经存在,但是这时候父类对象还没有被初始化。

2.2 用法

在Java中super有两种使用场景。

2.2.1 在子类中调用父类的属性或方法

在子类中调用父类的属性或方法。特别是子类中有与父类相同的属性或者方法,那么这时如果你想调用父类的属性或者方法,那么你必须使用super关键字。因为子类中和父类中的属性或方法同名,则父类中的方法或属性将被覆盖或隐藏。super可以指代父类中的类属性和类方法,但是并不建议这么用,虽然不会报错,但是说明你对static关键字还不够了解。请认真查看并理解static关键字。

public class Parent {public String name = "小头爸爸";public boolean hasMoney = false;public void sleeping(){System.out.println("爸爸已经睡了");}public void working(){System.out.println("爸爸正在工作。。。");}
}public class Child extends Parent {public String name = "大头儿子";/*** 当子类和父类有属性重名时,需要super才能调用到父类的属性,* 直接调用会调用到子类的属性* 如果不重名,可直接调用且调用的是父类的属性*/private void testParam(){System.out.println("爸爸的名字叫" + super.name);System.out.println("孩子的名字是" + name);System.out.println("爸爸是否有有钱:" + hasMoney);}/*** 方法和上面的属性结果一样*/public void testMethod(){sleeping();super.sleeping();super.working();}public void sleeping(){System.out.println("儿子已经睡了");}public static void main(String[] args) {Child child = new Child();child.testParam();child.testMethod();}
}

测试结果:

爸爸的名字叫小头爸爸
孩子的名字是大头儿子
爸爸是否有有钱:false
儿子已经睡了
爸爸已经睡了爸爸正在工作。。。
2.2.2 在子类中指代父类构造器

在Java中,子类是父类的派生类,它的实例化依赖于父类的实例化。所以它的任何一个构造函数都必须要初始化父类,Java就是super关键字调用父类构造方法,来完成这个操作。
有人会奇怪,那为什么在2.1.1的例子,父类没有构造方法,子类也没有构造方法,难道在某些情况下,实例的初始化并不依赖于构造函数?
答案是,实例的初始化必须要构造函数。2.2.1没有构造函数的原因是,在Java类定义中,如果开发者没有显示的定义构造函数,那么Java会隐式的为该类定义一个无参构造函数。但是如果开发者自己定一个构造函数(无论有参还是无参),那么Java就不会再为该类隐式的定义一个无参构造函数了。

那么还原构造函数后的代码:

public class Parent {...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关键字。

java中的super关键字相关推荐

  1. Java中的static关键字详解

    ** Java中的static关键字详解 ** 在一个类中定义一个方法为static,即静态的,那就是说无需本类的对象就可以调用此方法.调用一个静态方法就是 "类名.方法名" ,静 ...

  2. Java:继承之super关键字,继承之私有权限,继承之方法重写,继承之object类,继承之简单工厂模式

    一.继承的概念及用法       继承背后的思想就是        基于已存在的类来构建新类         当从已存在类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 ...

  3. java继承类型的用法_详解Java中使用externds关键字继承类的用法

    理解继承是理解面向对象程序设计的关键.在Java中,通过关键字extends继承一个已有的类,被继承的类称为父类(超类,基类),新的类称为子类(派生类).在Java中不允许多继承. (1)继承 cla ...

  4. Java 面向对象:super关键字的理解

    Java 面向对象:super关键字的理解 一.Super关键字: 1. super调用父类的构造方法,必须在构造方法的第一个 2. super只能出现在子类的方法或构造方法中! 3. super和t ...

  5. 解析java中的abstract关键字

    解析java中的abstract关键字 1 含义 abstract:抽象的;是java中用来修饰类和方法一个关键字 2 为什么要用 2.1 当我们不想类能够实例化时(类实例化没有意义,例如Animal ...

  6. 面试季,Java中的static关键字解析

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面 ...

  7. Java中的instanceof关键字

    Java中的instanceof关键字 instanceof是Java的一个二元操作符,和==,>,<是同一类东东.由于它是由字母组成的,所以也是Java的保留关键字.它的作用是测试它左边 ...

  8. 浅谈Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  9. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

最新文章

  1. note同步不及时 one_你的生活一团糟,就是因为不懂得管理
  2. 迭代器 生成器 装饰器 匿名函数
  3. RocketMQ的Consumer详解之push和pull模式(长轮询)
  4. git 回退上一个版本_Git小白使用教程:详细、显现、真正手把手教!
  5. slab 着色如何最大限度地利用 Cache Lines 或 Cache Rows?
  6. 吴恩达机器学习2——单变量线性回归
  7. 使用盒子模型仿照优酷的页面片段
  8. Linux cc 和 gcc 的区别概括介绍
  9. 为什么很多人说Python简单呢?
  10. Python 入门 Day5
  11. js修改mysql数据库数据_Node.js操作mysql数据库增删改查_node.js
  12. PHP 导出excel
  13. Python获取打印机读数(东芝泰格)
  14. R语言使用epiDisplay包的roc.from.table函数可视化临床诊断表格数据对应的ROC曲线并输出新的诊断表(diagnostic table)、输出灵敏度、1-特异度、AUC值等
  15. layui 单图片上传 多图片批量上传
  16. html目录ppt,PPT目录内容怎么写?
  17. 干货分享:实用/高效/有逼格的Android Studio 常用配置/插件推荐
  18. 移动端弹出层滚动时禁止body滚动
  19. 卡巴斯基分析报告:宠物追踪器面临的潜在风险
  20. echarts.js?1be7:2178 There is a chart instance already initialized on the dom. echats图表报错

热门文章

  1. Android-设备管理器Device Administration
  2. Hadoop大数据零基础高端实战培训视频
  3. 万邦淘宝代购系统;海外代购系统;代购程序,代购系统源码PHP前端源码
  4. 玩转华为ENSP模拟器系列 | 两个网关之间存在NAT设备时通过IKE方式协商IPSec VdPdNd隧道(总部不指定分支IP地址)
  5. 董宇辉的解答一位父亲请教如何让子女从心里喜欢上英语
  6. 异步组件与withRouter路由方法
  7. 加班多年,你敢说没遇过这种破事我也是服!
  8. RabbitMQ远程过程调用(RPC)
  9. 未来,中国的互联网会是什么样子?
  10. Web前端就业前景怎样 在学web前端如何求职就业