super与this关键字

先总结再解释:

super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

this关键字:指向自己的引用。

super注意点:
1.super调用父类的构造方法,必须在构造方法的第一行
2.super必须只能出现在子类的方法或者构造方法中!
3.super和this不能同时调用构造方法!
VS this:
代表的对象不同:
this:代表本身调用者这个对象
super:代表父类对象的引用
前提:
this:没有继承也可以使用
super:只能在继承条件下才可以使用
构造方法的区别:
this();本类的构造
super();父类的构造

穿插一点继承里的东西:

子类对象在实例化时会默认先去调用父类中的无参构造方法,之后再调用本类中的相应构造方法。

子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带参,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。(可参考最后一条规则示例:)

如果父类构造器无参,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

如下:

//父类:
package com.oop.Test05;
public class Person{
//父类的无参构造
public Person() {
System.out.println("父类无参构造执行了");
}
}
//子类:
package com.oop.Test05;
public class Student extends Person{
//子类的无参构造
public Student() {
//super();可显式可隐藏,若显式,则必须放在第一行
System.out.println("子类的无参构造执行了");
}
}
//测试类:
package com.oop;
import com.oop.Test05.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}

输出:

父类无参构造执行了
子类的无参构造执行了

继承条件下构造方法调用规则如下:

1.子类的构造方法中没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,super()语句有没有都一样;

但是注意:若父类显式定义了有参构造方法,但未显式定义无参构造,此时父类中的无参构造方法就被干掉了,此时既无法使用super();语句调用父类的无参构造,同时子类也无法定义自己的无参构造。在这种情况下,super();语句,写了也没用,编译器报错,代码无法通过。不过我们只是无法调用无参,但是可以调用父类的有参构造。

可以通过下面的方法调用:(可参考最后一条规则示例:)

super(参数);
//参数列表匹配对应的有参构造

2.如果子类的构造方法中通过super显式调用父类的有参构造方法,此时父类无参构造方法不会被执行。

如下:

//父类:
package com.oop.Test05;
public class Person{
//父类的无参构造
public Person() {
System.out.println("父类无参构造执行了");
}
//父类的有参构造
public Person(String name) {
System.out.println("父类有参构造执行了");
}
}
//子类:
package com.oop.Test05;
public class Student extends Person{
//子类的无参构造
public Student() {
super("樱");
System.out.println("子类的无参构造执行了");
}
}
//测试类:
package com.oop;
import com.oop.Test05.Student;
public class Application {
public static void main(String[] args) {
Student student = new Student();
}
}

输出:


父类有参构造执行了
子类的无参构造执行了

3.如果子类的构造方法中通过this显式调用自身的其他构造方法,在相应构造方法中应满足:this语句放在第一行。

最新文章

  1. [LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项
  2. C++成员初始化顺序
  3. 用LoadRunner实现接口测试
  4. selvert的过滤器filter处理中文乱码
  5. Lua学习笔记(五):面向对象的实现
  6. ubuntu 12.04 lts安装golang并设置vim语法高亮
  7. KEIL、uVision、RealView、MDK、KEIL C51区别比较
  8. ORACLE用户管理方式下备份数据和复制数据库
  9. hdu 5578 Friendship of Frog(multiset的应用)
  10. 第一次线上OJ水友赛
  11. UEFI引导系统
  12. 用 Hexo + Github 搭建自己的博客
  13. 远程连接SQL Server 2014遇到的问题和解决
  14. Echarts 地图添加自定义区域
  15. dimens.xml详解
  16. 在 Angular 8 中,我们可以期待些什么
  17. [转] vue之computed和watch
  18. Largest Rectangular Area in a Histogram 最大连续面积
  19. 【NOI2017】泳池
  20. happens-before俗解

热门文章

  1. sxt_(001_003)_spring_ioc
  2. (0720) 【 表示 n'b0; 】
  3. [部署日记]Android Studio在同步Gradle的时候提示Could not resolve com.android.tools.build:gradle:7.0.4
  4. Cannot add middleware after an application has started
  5. 阿里云centos7安装图形界面gnome
  6. 日志参数 %n 引起的coredump
  7. linux 复合页( Compound Page )的介绍
  8. kubectl --v日志级别
  9. C# 当页面有很多选择条件时的处理方式
  10. 生成虚拟mac地址通过dhcp获取ip,耗尽dhco地址池