Java继承关系之富二代和他爹

首先需要知道继承的一些定义,简单讲下,但务必记住:

  • 继承概念里有子类和父类,父类又称为超类或者基类,子类又称为派生类(别换了个词就傻住了)
  • 继承是为了子类对象能拥有像父类一样的属性和方法(行为),子类也可以直接父类中非私有 ( public / protect )的属性和方法(行为)
  • 只能单继承 extends ,不能做多继承(接口 implements 可以做多实现)

上面提到了继承是为了父类的属性和方法,那么我们接下来重点就讲讲这块,为了让文章更有趣点,我会在下面例子中引入财产赚钱方法两个概念:财产=》属性、赚钱方法=》行为

有钱爹和他的富二代儿子

有这么一个有钱爹

/**
 * @author :炜哥
 * @description:TODO 一个有钱有赚钱门路的爹
 * @date :2021/4/21 14:05
 */
public class RichFather {

    //构造器
    public RichFather() {
        System.out.println("富一代爸爸我出生了");
    }
    
    //爸爸我有1000万现金
    protected int money = 10000000;

    protected void makemoney(){
        money += 100000;
        System.out.println("这是爸爸的赚钱方法");
    }
}

ok,富二代来了

/**
 * @author :炜哥
 * @description:TODO 富二代
 * @date :2021/4/21 14:09
 */
public class RichSecondGeneration extends RichFather{

    //无参构造器
    public RichSecondGeneration() {
        //子类的构造方法中默认会在第一句代码中添加super(),表示调用父类的构造方法
        //父类成员变量初始化后,才可以给子类使用
        //super(); 
        System.out.println("富二代出生了");
        //super(); //只能是在第一句代码中,放在这里是不行的
    }
    
    //一万块零花钱
    public int money = 10000;
    
    public void consume(int consume_money) {
        System.out.println("我在夜场消费,花了" + consume_money + "元");
        money -= consume_money;
        System.out.println("我的钱还剩" + money);
        System.out.println("爸爸的钱还剩" + super.money);
    }
}

亲爹只能有一个(只能单继承extends)

谁亲爹能是多个的?

谁先出生(创建对象时,构造函数执行顺序)

 public static void main(String[] args) {
     //富二代出生
     RichSecondGeneration richSecondGeneration = new RichSecondGeneration();
 }

爸爸都没出生,儿子你怎么出来?

富一代爸爸我出生了
富二代出生了

但如果爸爸是叼着钱(比喻的我自己都有点想笑)出生的, RichFather 类的构造器变成:

//构造器
public RichFather(int money) {
    System.out.println("富一代爸爸我出生了,嘴里叼着" + money);
}

那么富二代出生的时候就要声明他爸不是正常出生方式 super (无参构造函数)了,谁出生叼个钱啊:

//构造器
public RichSecondGeneration() {
    super(50);//如果父类没有无参构造函数,那么子类在初始化对象时必须要加有参super声明
    System.out.println("富二代出生了");
}

富一代爸爸我出生了,嘴里叼着50
富二代出生了

其实上面的比喻也不太贴切,父类的有参构造和无参构造函数有同时存在的情况,这种情况也不需要 super 声明,即只要父类存在无参构造就不需要 super 声明

花了谁的钱(成员变量重名)

爹和富二代儿子都有钱 money ,如果去消费到底会消费谁的?测一波

//测试方法 
public static void main(String[] args) {
     RichSecondGeneration richSecondGeneration = new RichSecondGeneration();
     //富二代消费
     richSecondGeneration.consume(4000);
 }

结果:

我在夜场消费,花了10000元
我的钱还剩6000
爸爸的钱还剩10000000

这个money花的是富二代自己的钱( this ),为啥,因为儿子你没去拿爸爸的钱呀( super ):

public void consume() {
    System.out.println("我在夜场消费超标" + consume_money + ",只能把老爸的钱偷过来花了");
    super.money -= consume_money;
    System.out.println("我的钱还剩" + money);
    System.out.println("爸爸的钱还剩" + super.money);
}

我在夜场消费超标4000,只能把老爸的钱偷过来花了
我的钱还剩10000
爸爸的钱还剩9996000

钱藏起来了怎么拿(如何获取父类的私有成员变量)

他爸一看不对啊,这小逼崽子胆肥了呀,不行,得把钱藏起来

//爸爸我有1000万现金,但现在钱要藏起来了
private int money = 10000000;//protect设置为private

这个时候,儿子他想偷是偷( super)不过来了,怎么办,他想到了通过他妈(父类的公共方法),于是在 RichFather 类中增加两个方法:

//在爸爸的世界里,妈妈拿钱是天经地义的
public void consumeMoneyByMonther(int consumeMoney) {
    this.money -= consumeMoney;
    System.out.println("妈妈拿走了" + consumeMoney);
}

//让妈妈看看爸爸还剩多少钱
public int getMoney() {
    return this.money;
}

龟儿子手段升级,消费方式consume() 再次更新:

public void consume(int consume_money) {
    //手段升级,通过妈妈拿钱
    System.out.println("我在夜场消费超标" + consume_money + ",老爸的钱藏起来,怎么办?");
    consumeMoneyByMonther(consume_money);
    System.out.println("我的钱还剩" + money);
    System.out.println("爸爸的钱还剩" + super.getMoney());
}

我在夜场消费超标4000,老爸的钱藏起来,怎么办?
妈妈拿走了4000
我的钱还剩10000
爸爸的钱还剩9996000

算了,还是教儿子赚钱吧(成员方法继承)

爸爸觉得这样下去不是个办法,只能让儿子去赚钱 makemoney() ,否则要坐吃山空了:

//富二代洗心革面,开始赚钱
richSecondGeneration.makemoney();
System.out.println("我的钱还剩" + richSecondGeneration.money);
System.out.println("爸爸的钱还剩" + richSecondGeneration.getMoney());

这是爹爹的赚钱方法
我的钱还剩10000
爸爸的钱还剩10100000

所以整了半天,儿子发现自己上当了,赚钱 makemoney() 是在给爸爸赚,不行,我要把爸爸的赚钱门路归为自己所有(重写父类方法@Override),在富二代 RichSecondGeneration 类中新增方法

@Override
public void makemoney (){
    System.out.println("这是富二代的赚钱方法");
    this.money += 5000;//每个月赚的不多
}

这是富二代的赚钱方法
我的钱还剩15000
爸爸的钱还剩10000000

而且富二代出息了,还能顺便帮爸爸管理着赚钱

@Override
public void makemoney (){
    System.out.println("这是富二代的赚钱方法");
    this.money += 5000;//每个月赚的不多
    super.makemoney();//顺便帮爸爸管理着赚钱
}

这是富二代的赚钱方法
这是爹爹的赚钱方法
我的钱还剩15000
爸爸的钱还剩10100000

居然后还能花式赚钱(**重载),新增 makemoney 方法,不同的是需要传入参数

public void makemoney(String cannel){
    System.out.println("这是富二代的赚钱方法");
    System.out.println("在" + "渠道上赚钱");
    this.money += 1000;//每个月其他渠道赚的钱
}
//花式赚钱
richSecondGeneration.makemoney("拼多多");

这是富二代的赚钱方法
在拼多多渠道上赚钱

父慈子孝,皆大欢喜

此外还有一些不太好比喻的规范,就在这边直接讲了:

  • 子类方法覆盖父类方法时,必须要保证子类权限 >= 父类权限
  • 方法重写时,子类的返回值类型必须要 <= 父类的返回值类型
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值