Java之super关键字

Wesley13
• 阅读 567

[toc]

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继承之再谈构造器

参考书籍:《Thinking in Java》、《疯狂Java讲义》

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这