子类重写父类构造器以及其他方法

若父类重写了自身的构造器,并且还实现了自己的方法,那么,当子类继承父类后,重写自身的构造器和重写父类的其他方法时,搭配super()或者super.method()时候,会出现什么现象呢?

先看构造器

public class Checket extends Base {
    public Checket() {
        super();// 位置1
        System.out.println("Checket");
        super();// 位置2
    }

    public static void main(String[] args) {
        Checket checket = new Checket();
    }
}

class Base {
    public Base() {
        System.out.println("Base");
    }
}

第一眼看过去:

  • 子类Checket继承了父类Base
  • 父类重写了构造器(PS:若类的无参构造用不到的话,重写构造器后,可以不写无参构造)
  • 子类重写了自身的构造器,而且可以看到上面代码好像对super()有点事情要干

疑问来了:

  • 首先考虑,如果我要加super()的话,位置1,位置2都无所谓的吗?
  • 如果不写super()的话,和写super()并且写在正确的位置上,有区别吗?

解答:

  • 如果写super()的话,super()只能放在位置1,放在位置2,则编译不通过
  • 构造器里面,不写super()和写super()没区别

u say a jb without picture 无图言屌,下面上图:
这里写图片描述
可以看到,IDEA上面提示了:在构造器方法体内,必须在第一条语句调用super()
也就是说,子类重写构造器,要么不调用super(),要么就第一句就调用super(),写在第一行!
打印结果:
写不写super(),打印结果都一样:

Base
Checket

继续,如果你子类Checket只有一个无参构造器(或者不写,默认),打印结果如下:
只打印父类构造器内容,子类构造不写,就没有东西,不打印呗

Base

再看重写父类方法

我们知道,在使用eclipse或者IDEAIDE时候,子类重写父类方法是,第一条语句都会自动生成super.methodName()

package com.ggsddu.test;

/**
 * @author zhouk
 * @date 2018/05/18
 */
public class Checket extends Base {
    public Checket() {
        // super();
        System.out.println("Checket")
    }

    @Override
    public void sayHi() {
        super.sayHi();// 放在这里,编译、运行都是OK的
        System.out.println("say hi from Checket");
        super.sayHi();// 放在这里,编译、运行都是OK的
    }

    public static void main(String[] args) {
        Checket checket = new Checket();
        checket.sayHi();
    }
}

class Base {
    public Base() {
        System.out.println("Base");
    }

    public void sayHi() {
        System.out.println("say hi from Base");
    }
}

如上面代码所示:
super.methodName()放在重写方法方法体的哪个位置都是可以的,和一般语句没差。
所以,你写,那就打印父类方法的,不写,那就不打印。
本次实际代码,重写sayHi方法代码如下:

@Override
public void sayHi() {
    System.out.println("say hi from Checket");
    super.sayHi();
}

结合上面子类重写自身构造器,打印结果为:

Base
Checket
say hi from Checket
say hi from Base

此处,也有图。
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值