Java super关键字调用父类过程解析

 更新时间:2019年12月16日 09:18:54   作者:sumerday  
这篇文章主要介绍了Java super关键字调用父类过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Java super关键字调用父类过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

话不多说,直接上代码:

package com.my.pac14;

/**
 * @auther Summerday
 */
public class SuperTest {
  public static void main(String[] args) {
    SubClass sb = new SubClass(20);
    //创建子类的对象,调用子类的print方法
    sb.print();
  }
}

class BaseClass {
  public int a = 5;
  public int b;
  static public int c = 30;

  BaseClass(int b) {
    this.b = b;
    System.out.println("superb:" + this.b);
  }

  public void print() {
    System.out.println("父类的a = " + a);
    //System.out.println(this.a);
  }

  public void read() {
    System.out.println("read..");
  }
}

class SubClass extends BaseClass {
  public int a = 10;
  //子类中的实例变量将父类中的隐藏,所以下面的this.b=0
  public int b;
  static public int c = 40;
  
  SubClass(int b) {
  //调用父类的构造器
    super(b);//20
    System.out.println("superb:" + super.b + ",subb:" + this.b);//0
  }

  public void print() {
    //打印父类中的a=5
    System.out.println(super.a);//5
    //调用父类的print方法,打印a=5
    super.print();//5
    //直接打印a,会打印出当前类的a,打印子类的a=10
    System.out.println("子类的a = " + a);
    //类变量也会覆盖
    System.out.println(c);
    //用父类名访问父类的类变量
    System.out.println("父类中的类变量c = " + BaseClass.c);
    //没有重写,不需要使用super调用父类方法
    read();
  }

}

super用于限定该对象调用从父类继承得到的实例变量或方法,因此和this相同的是,super不能出现在static修饰的方法中。(因为static修饰的方法属于类,调用者将会是类,而不是一个对象)

调用父类成员变量

实例变量

可以直接利用super.xx限定访问父类的实例变量。

//父类
public int a = 5;
//子类
public int a = 10;
//在子类中访问父类的实例变量
public void print() {
  //打印父类中的a=5
  System.out.println(super.a);//5
  //直接打印a,会打印出当前类的a,打印子类的a=10
  System.out.println("子类的a = " + a);
}

类变量

如果父类变量是用static修饰的类变量,则需要用父类类名.xx限定访问其类变量。(虽然可以使用super访问父类中的类变量,就像我们之前说的用类的实例访问类变量,但是极不规范,不建议。)

//父类
static public int c = 30;
//子类
static public int c = 40;
//在子类中访问父类的类变量
public void print() {
  //类变量也会隐藏
  System.out.println(c);
  //用父类名访问父类的类变量
  System.out.println("父类中的类变量c = " + BaseClass.c);
} 

总结:

  • 子类中没有包含和父类同名的成员变量,就无需使用super或父类名显式调用。
  • 如果在没够方法中访问某成员变量,但没有显式指定调用者,则查找该成员变量的顺序:
    • 查找该方法中有没有。
    • 查找该类中有没有。
    • 查找父类中有没有。
    • ……
  • 如果没有找到,就会报错。

当创建一个子类对象时,系统不仅会为该类中定义的实例变量分配内存,也会为它从父类继承得到的所有实例变量分配内存,即使子类定义了与父类中同名的实例变量。所以,子类中定义与父类同名的实例变量并不会完全覆盖父类中定义的实例变量,只是简单地隐藏。

调用父类的方法

我们之前说过,子类中定义与父类同名且参数列表相同的实例方法(static方法不能被重写)就是所谓的方法重写,此时子类的方法会覆盖父类的方法。

  • 在子类中想调用父类的同名实例方法,可以利用:super.父类方法名;
  • 如果是类方法,则可以用父类名.父类方法名调用。(super依旧可以,但不建议)
  • 如果没有同名,就不需要显式用super调用父类方法。
//父类
public void print() {
  System.out.println("父类的a = " + a);
  //System.out.println(this.a);
}
public void read() {
  System.out.println("read..");
}
//子类
 public void print() {
  //调用父类的print方法,打印a=5
  super.print();//5
  //没有重写,不需要使用super调用父类方法
  read();
}

调用父类构造器

关于子类中利用super关键字调用父类构造器,在上一篇中,已经做出总结,具体可参看:Java继承构造器使用过程解析

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 如何使用IDEA新建一个普通的Javaweb项目

    如何使用IDEA新建一个普通的Javaweb项目

    今天给大家普及如何使用IDEA新建一个普通的Javaweb项目及配置tomcat的方法,在文末给大家提到如果不想每次都重启tomcat,可以设置快捷方式,对idea新建Javaweb项目感兴趣的朋友一起看看吧
    2021-06-06
  • Spring Boot Async异步执行任务过程详解

    Spring Boot Async异步执行任务过程详解

    这篇文章主要介绍了Spring Boot Async异步执行任务过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot如何使用TraceId日志链路追踪

    SpringBoot如何使用TraceId日志链路追踪

    文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • 什么是Java自旋锁

    什么是Java自旋锁

    这篇文章主要介绍了什么是Java自旋锁,在有些场景中,同步资源的锁定时间很短,为了这一小段时间去切换线程,线程挂起和恢复现场的花费可能会让系统得不偿失,下面来了解具体内容介绍吧
    2022-01-01
  • Struts2的配置文件方法小结

    Struts2的配置文件方法小结

    最近正在学习Struts2,在配置文件中遇到好多标签,各种意义不同。下面这篇文章就来给大家介绍关于Struts2配置文件的相关资料,文中通过图文介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧。
    2018-04-04
  • Flowable 设置任务处理人的四种方式详解

    Flowable 设置任务处理人的四种方式详解

    这篇文章主要为大家介绍了Flowable 设置任务处理人的四种方式详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • 浅谈 JDBC 元数据

    浅谈 JDBC 元数据

    这篇文章主要介绍了JDBC元数据的相关内容,涉及一些获取数据源各种信息的方法,具有一定参考价值,需要的朋友可以了解下。
    2017-09-09
  • JAVA基础类库之String类,StringBuffer类和StringBuilder类

    JAVA基础类库之String类,StringBuffer类和StringBuilder类

    这篇文章主要介绍了Java中基础类库的String类,StringBuffer类和StringBuilder类,是Java入门学习中的基础知识,需要的朋友可以参考下
    2021-09-09
  • 详解Java泛型及其应用

    详解Java泛型及其应用

    这篇文章主要介绍了Java泛型及其应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • spring本地事务失效的原因分析

    spring本地事务失效的原因分析

    这篇文章给大家介绍了spring本地事务失效的情况原因分析,给大家罗列了五种原因分析,通过代码示例介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2023-10-10

最新评论