Java中super关键字及super()的使用:

1、super的使用:

(1)super是一个关键字。

(2)super和this很类似,我们对比着学习。


2、先复习一下this关键字的使用。

(1)this能出现在实例方法和构造方法中;
(2)this的语法是“this.”和“this()”;
(3)this不能出现在静态方法中;
(4)this大部分情况下是可以省略的;
(5)this.什么时候不能省略呢?
在区分局部变量和实例变量时不能省略。例如:

Public void setName(String name){this.name = name;
}

(6)this()只能出现在构造方法的第一行,通过当前的构造方法去调用“本类”中的对应的构造方法,目的是:代码复用。


3、super关键字:

(1)super能出现在实例方法和构造方法中。

(2)super的语法是“super.”和“super()”。

(3) super不能出现在静态方法中。

(4) super大部分情况下是可以省略的。

(5)super.什么时候不能省略呢?
别急,我们想一下this指向的是什么,是当前对象自己。super和this类似,它指向了当前对象自己的父类型特征(也就是继承过来的那些东西)。

super和this区别是:this可以看做一个引用变量,保存了该对象的地址,是当前对象整体,而super代表的是父类型特征,是子类局部的一些东西,这些继承过来的东西已经在子类里面了,你可以输出整体this,但不能输出父类型特征super。因为super指向的东西不是一个整体,没法打印输出。

System.out.println(this);  //输出this.toString()的值
System.out.println(super);  //编译报错,需要'.'

当在子类对象中,子类想访问父类的东西,可以使用“super.”的方式访问。例如:方法覆盖后,子类内部虽然重写了父类的方法,但子类也想使用一下父类的被覆盖的方法,此时可以使用“super.”的方式。当子类中出现和父类一样的属性或者方法,此时,你要想去调用父类的那个属性或者方法,此时“super.”不能省略。

this和super都只能在对象内部使用。
this代表当前对象本身,super代表当前对象的父类型特征。

“this.”是一个实例对象内部为了区分实例变量和局部变量。
而“super.”是一个实例对象为了区分是子类的成员还是父类的成员。
父类有,子类也有,子类想访问父类的,“super.”不能省略。

(6)super()只能出现在构造方法的第一行,通过当前的构造方法去调用“父类”中的对应的构造方法,目的是:创建子类对象时,先初始化父类型特征。

用通俗的话来讲,要想有儿子,得先有父亲。

我们来看下面代码:
写两个类,Animal和Cat,Cat继承Animal。

//父类,Animal类
class Animal {//构造函数public Animal() {System.out.println("Animal类的无参数构造函数执行");}
}//子类,Cat类
class Cat extends Animal{//构造函数public Cat() {System.out.println("Cat类的无参数构造函数执行");}
}

执行下面一行代码:

public static void main(String[] args) {Cat cat = new Cat();
}

运行输出结果为:

Animal类的无参数构造函数执行
Cat类的无参数构造函数执行

我们发现实例化一个子类的对象,也就是调用了子类的构造方法,为什么父类的无参数构造方法也执行了,并在子类构造方法执行之前就已经执行了父类的无参数构造方法,好奇怪。

刚刚在上面的super关键字的使用第6点,我已经说了,super()和this()方法一样,都只能在构造方法的第一行出现。我们猜想,难道子类的构造方法第一行有一个隐形的super()方法?答案是肯定的。

我们把子类的构造方法的第一行给它加上super():

//子类,Cat类
class Cat extends Animal{//构造函数public Cat() {super();System.out.println("Cat类的无参数构造函数执行");}
}

再执行下面代码:

Cat cat = new Cat();

运行输出结果为:

Animal类的无参数构造函数执行
Cat类的无参数构造函数执行

和刚才的子类构造方法没加super()的运行结果是一样的。

所以说当子类的构造方法内第一行没有出现“super()”时,系统会默认给它加上无参数的"super()"方法

开始讲道理:
阅读仔细的人会发现,为什么是没有“this()和super()”就写上“super()”?有“this()”就不能写上“super()”吗?那我问你,当构造方法第一行有"this()"时,你还能手动添加“super()”吗?显然不行,因为“this()”也只能出现在第一行,你不能在它前面写任何代码。所以我们又得出一个结论:构造方法中“this()”和“super()”不能同时出现,也就是“this()”和“super()”都只能出现在构造方法的第一行。

上面谈的都是无参数的“super”方法,我们也可以在构造方法的第一行使用有参数的“super(父类构造函数的参数列表)”,但值得注意的是,当子类构造方法执行有参数的“super(参数列表)”方法,你得确保父类中也有对应的有参数构造方法,不然会编译报错。同样我要提醒一下,当子类构造方法的第一行执行super()无参数方法,那么父类中一定要有无参数构造方法,有的人可能会在父类中写了有参数的构造方法,却忽略了写无参数构造方法,那么在子类构造方法内就会报错,因为当你在一个类中写了有参数的构造方法时,无参数构造方法就会不存在,你需要自己补上无参数的构造方法,这是一个良好的编程习惯。

无论你子类构造方法有没有“this()”和“super()”方法,实例化子类对象一定一定会执行对应的父类构造方法,即不管实例化了一个怎样的孩子,它一定会先实例化一个对应的父亲。


下面给道例题练习一下this()和super()方法:

public class MyTest {public static void main(String[] args) {new Cat(); }
}//父类,Animal类
class Animal {//构造函数public Animal() {super();System.out.println("1:Animal类的无参数构造函数执行");}public Animal(int i) {super();System.out.println("2:Animal类的有int参数构造函数执行");}
}//子类,Cat类
class Cat extends Animal{//构造函数public Cat() {this("");System.out.println("3:Cat类的无参数构造函数执行");}public Cat(String str) {super(5);System.out.println("4:Cat类的有String参数构造函数执行");}
}

输出结果为:

2:Animal类的有int参数构造函数执行
4:Cat类的有String参数构造函数执行
3:Cat类的无参数构造函数执行

我们又可以得出一个结论:不管你创建什么对象,Object对象的无参数构造方法一定会先执行,因为Object是所有类的根类。


说了这么多,super()到底什么时候使用?再来看下面代码:

public class MyTest {public static void main(String[] args) {Cat c1 = new Cat(3); System.out.println("名字:" + c1.getName());System.out.println("年龄:" + c1.getAge());}
}//父类,Animal类
class Animal {//私有属性:名字private String name;//setter and getterpublic void setName(String name) {this.name = name;}public String getName() {return name;}//构造函数public Animal() {}public Animal(String name) {this.name = name;}
}//子类,Cat类
class Cat extends Animal{//私有字段:年龄private int age;//setter and getterpublic void setAge(int age) {this.age = age;}public int getAge() {return age;}//构造函数public Cat() {}public Cat(int age) {this.age = age;}
}

输出结果:

名字:null
年龄:3

我们也知道,没有给c1对象的name赋值嘛,当然为默认值null啦。
确实如此,所以我们给Cat加一个构造方法,给name和age都赋值。如下:

public Cat(String name, int age) {this.name = name; //报错this.age = age
}

显然这样做是会报错的,因为name已经被父类封装成private的了,不能直接访问,可能有的人会这样做:

public Cat(String name, int age) {setName(name); // 因为父类的setName()方法是public的this.age = age;
}

显然这样做的确可以做到给父类的name赋值,但这样做是不建议的,我们在构造方法中通常只调用构造方法,不会去调用实例方法,况且当不止一个变量时,用set方法时,我们就要调用好多个实例方法去完成多个变量的赋值。这时候为什么不考虑使用super()方法呢?如下:

public Cat(String name, int age) {super(name);this.age = age;
}

这样就显得文雅,美观多了。


总结:
1、this和super一样,都是对象内部的引用变量,只能出现在对象内部;

2、this指向当前对象自己,super指向当前对象的父类型特征,故this的东西比super多,也就是super是this的一部分;

3、this()和super()都只能出现在构造方法的第一行,故this()和super()方法不能共存,当一个类的构造方法第一行中没有this(),也没有super(),系统默认有super()方法;

4、this()是构造方法中调用本类其他的构造方法,super()是当前对象构造方法中去调用自己父类的构造方法。


不知道你现在对 this和super 有没有一个新的认识?嘿嘿。

Java中super关键字及super()的使用相关推荐

  1. Java中this关键字和super关键字用法

    构造方法中的this关键字 构造方法是一个类的对象在通过new关键字创建时自动调用的,在程序中不能向调用其他方法一样通过方法名(也就是类名)来调用.但如果一个类有多个构造方法,可以在一个构造方法中通过 ...

  2. java中的关键字:this与super 大详解

    文章目录 1.this 1.1. this是什么? 1.2 this调用对象中的属性.构造器和方法 2.super 2.1 super是什么? 2.2 super调用父类的属性.构造器.方法 3. t ...

  3. java中this.getclass()_详解java中this.getClass()和super.getClass()的实例

    详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. ...

  4. java中getclass_详解java中this.getClass()和super.getClass()的实例

    详解java中this.getClass()和super.getClass()的实例 前言: 遇到this.getClass()和super.getClass()的返回值感到疑惑,经过探索豁然开朗. ...

  5. java中的关键字static

    原文链接: https://zhuanlan.zhihu.com/p/70110497 昨晚面试中被问到,没能回答出来.这篇答疑文章写得非常好,无一字可增删,遂直接复制. 在平时开发当中,我们经常会遇 ...

  6. 深入分析Java中的关键字static

    深入分析Java中的关键字static 一.static关键字的基本用法 1.static关键字基本概念 方便在没有创建对象的情况下来进行调用.也就是说:被static关键字修饰的不需要创建对象去调用 ...

  7. java中的关键字英汉

    java中的关键字 初入java记录贴 类: enum(枚举).interface(接口).class(类).extends(继承).implements(实现接口) 对象: new(创建).inst ...

  8. 【Java_基础】Java中Native关键字的作用

    本篇博文转载与:Java中Native关键字的作用 转载于:https://www.cnblogs.com/leiblog/p/10529056.html

  9. java中final关键字的使用

    final 中文翻译为 最终的,在java中也是较为常用的关键字之一. 在java 中 final 关键字可以修饰  类.方法.变量 final 修饰在类上,则表示该类不能被继承,如果里面的成员变量没 ...

最新文章

  1. java类引用接口的注释_java – 在接口类型上使用注释有什么好处?
  2. GitHub 的项目徽章
  3. 审批政策中收入与负债核实
  4. 接受java的返回值_java怎样接受 到return的值的?
  5. c语言单词字母翻转,C语言来实现字符串反转(只有单词反转,单词里的字母不反转)...
  6. 解决: ubuntu18.04没有网络直连
  7. 2.CND技术详解---CDN技术概述
  8. 亚马逊-不一样的电商公司
  9. 蓝桥杯python小学组_蓝桥杯python组如何准备
  10. windows下安装redis并设置开机自启动
  11. FFMPEG保存视频流数据至本地(rtsp转mp4)
  12. Flink on Yarn报错:Container released on a *lost* node
  13. AB罗克韦尔plc指示灯详解
  14. 天池竞赛赛题-特征工程-天猫用户重复购买预测解析
  15. JavaScript 中的继承(读书笔记思维导图)
  16. Visual Studio Codec#
  17. 接收Cookie总结
  18. 拖库还是撞库?网易邮箱罗生门
  19. CPU动态调频二:interactive governor
  20. 用python爬取《龙岭迷窟》评论,看看比同系列鬼吹灯作品以及《盗墓笔记》好在哪里?...

热门文章

  1. android5.0 物理键盘与软键盘同时使用修改
  2. TL-1到底是什么?
  3. Java牛客网社区项目——知识点面试题
  4. 蔚来大逆转:去年最惨,现在最富
  5. mysql导出权限授权_本文实例讲述了mysql数据库创建账号、授权、数据导出、导入操作。分享给大家供大家参考,具体如下:1、账号创建及授权grant all privileg...
  6. 全球与中国1,2,4-丁三醇市场深度研究分析报告
  7. 以旧换新,iPhone5s免费拿
  8. Bugku / CTF / WEB 输入密码查看flag
  9. 唐骏:身价10亿不买房 每月12万住宾馆
  10. Arch Linux 指南 02——安装图形界面