Java学习里程-----Java基础_11Java继承

一、继承

继承是指从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

Java中,不允许子类同时继承两个父类,但是,可以让一个父类可以被很多子类继承。而且不能继承父类私有的属性和方法。

比如说子承父业,是吧。子类继承了父类家业,但是不能继承父亲的思想,因为思想是父亲自己私有的东西。

二、继承的实现

接下来,我们呢来实现一下继承,先说一下我们要做的事情。

1. 先定义一个好吃的类,这是父类,然后我们简单创建两个子类,一个汉堡包,一个披萨。

父类呢,我们定义属性,名称、价签。还有一个方法,叫创建方法。我们先上这些代码。

Java学习里程-----Java基础_11Java继承

看,这就是所有好吃的的父类,然后我们创建汉堡包和披萨类,他俩都“继承”这个好吃的。

Java学习里程-----Java基础_11Java继承

Java学习里程-----Java基础_11Java继承

2. 有了这俩之后,我们开始测试。

在汉堡包类中我们创建main方法,实例化汉堡包,并且给汉堡包名字、价签,并且输出。

Java学习里程-----Java基础_11Java继承

相同的,披萨也可以这样输出。

三、继承的重写

重写呢,我们之前有介绍过,大家可以看我另外的一个博客Java学习里程-----Java基础_9面向对象

我们现在来体验一下这个重写!我们再披萨这个类里面重写。

Java学习里程-----Java基础_11Java继承

首先第一个,@Override,这个就是继承的标志,可以删除,但是,我们不删除,为了让其他人看到这个的时候,知道这个是重写的。第二个,createFood()这个方法是不是很熟悉,这个是父类的方法哦,但是这个披萨里面的是重写的。第三个,super.createFood(),这个我先不说,我们一会写测试方法,来看这个是干啥的。

测试方法我们就也写在这个pizza里面。

Java学习里程-----Java基础_11Java继承

给一个名字,叫榴莲火腿肠披萨,70块钱。然后调用这个createFood()方法。写好之后执行,我们看结果。

Java学习里程-----Java基础_11Java继承

你看,我们发现有两个输出,第一个输出,其实就是我们父类的输出,第二个才是我们重写的这个。

下面我来解释这个是为啥。

鼠标移动到pizza.createFood()这个方法上,按ctrl,点击这个createFood(),我们发现,它是调用的本类的方法。

这就说我们调用的的确是重写之后的方法,但是为啥还将父类的输出也输出出来了?我们接着来看。

super.createFood用相同的方法,按住ctrl点击进去,我们发现是进去的父类的输出,这下就知道为啥会输出了父类的方法了吧。

这也就是说,super是调用父类的方法,super代表父类存储空间的标识,这就是super的含义。

四、super和this

说起super,我们还得说一个东西叫this。

this是自身的一个对象,代表对象本身。

我们来看Food这个父类:

Java学习里程-----Java基础_11Java继承

父类自己有一个name,有一个price,下面的get、set方法中,我们来看set方法。

它有一个name的参数,然后,将name这个值赋值给this.name,this.name代表的是父类Food的name,通过this的定义,我们可以明白,this代表当前Food这个类本身,所以,这个代码可以改成这样子滴:

Java学习里程-----Java基础_11Java继承

然后我们在运行披萨类中的main方法。

发现还是可以滴,正常运行,但是这么做有一点麻烦,所以,我们将上述的这种方式改成this.name。

这时候,会又有同学问了,不写this可不可以,我们可以试一试。

Java学习里程-----Java基础_11Java继承

它给我们一个警告,我们来看一下警告:The assignment to variable name has no effect

翻译过来呢,就是说分配的这个变量是无效的,因为,Java不知道这个赋值号左面的这个name指谁,它以为是传过来的这个name呢,但是我们是想给的是这个Food类中的name。所以要加this关键字。

除去这个地方用到了this,还有一个地方也用了this,那就是披萨类重写的时候,this.getName和this.getPrice这俩。

Java学习里程-----Java基础_11Java继承

但是不是说this指代的是当前对象吗?当前对象中不是没有这个getName的方法吗?

这时候,我们就得想继承的定义了。继承是不能继承私有的属性、方法,但是公共的它都会做继承。我们再来想,既然继承了,为啥看不到呢?其实Java中是这样操作的,如果子类中没有重写,那么就去调用父类的。

然后我们再披萨这个类中,按alt + shift + s,选择

Java学习里程-----Java基础_11Java继承

我们将这个选择上,然后确定。

Java学习里程-----Java基础_11Java继承

看,原因找到了,我们调用的this.getName实际上调用的这个方法。不信的话大家可以ctrl + 点击this.getName方法。我们看是调用的那个方法。

Java学习里程-----Java基础_11Java继承

这样我们就明白了。