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("拼多多");
这是富二代的赚钱方法
在拼多多渠道上赚钱
父慈子孝,皆大欢喜
此外还有一些不太好比喻的规范,就在这边直接讲了:
- 子类方法覆盖父类方法时,必须要保证子类权限 >= 父类权限
- 方法重写时,子类的返回值类型必须要 <= 父类的返回值类型
标签:Java,二代,money,System,之富,println,public,out 来源: https://blog.csdn.net/qq_16887951/article/details/116020753