前言:身为刚刚接触java不久的我,将以初学者角度来介绍关于继承的概念,教学说不上,顶多算是学后分享以及总结。有任何说法不正确的,欢迎提出,也请多多包涵。
刚知道java时,就在网上看到了有关java的三大特性(封装、继承、多态),但仅仅只是理解(其实只是看懂了概念,不应用就没有真正理解),当逐渐学习之后,才明白继承的基本用法。
对于继承的理解:官方解释相比大家都已经看了很多了,不如我来讲个故事,以我对继承的理解来说说这个事:
很久很久以前,一个星球诞生了——地球。由于环境适宜,逐渐的,在这个荒芜的星球上多了一种可爱的单细胞生物A种族(Object类,所有类的祖先),这个种族有着能抵御极度温差的保护组织(属性,也就是类中的变量),长着可以移动的器官(属性,也就是类中的变量),会通过晒太阳来补充能量(行为,也就是类中的函数)。只不过每个个体(对象,实例化)间或多或少都是有些差异,有的保护组织是细胞壁,有的则是细胞膜;有的移动器官是鞭毛,有的是类似蹼的裙边。它们获取的能量也因为个体的不同而有所不同。
慢慢的,随着时间的流逝,多了一个新的物种B种族(Object类的子类),它并不是凭空出现的,是根据那个单细胞生物逐渐演化而来。它不仅有单细胞生物有的保护组织和移动器官(父类自带的属性),而且还多了能够融化其他单细胞细胞壁的消化器官(子类新加的属性)。它不仅能靠太阳提供能量,还能通过吞噬其他单细胞来获取能量(子类新加的行为)。
正是因为有了这个B种族的存在,为了自保,A种族又分化出一个新的种族C种族(Object类的另一个子类,说明一个父类可以有多个子类),这个种类除了有着A种族的属性和行为,还长着可以抵御B种族消化器官的攻击器官(子类新加的与B类不同的属性)。
就这样,生物不断演变进化,地球上的物种越来越多,最终形成了一个生态多样化的星球。
从这个故事中我们可以了解:
当然,实验是检验真理的唯一标准,不能光靠讲故事来理解,更要通过代码来进行检验。
首先,建立一个ARace类(A种族)。
它的变量是race(种族类型)、protectiveTissue(保护组织)和mobileOrgans(移动器官),以及间接访问函数setget和函数getSunEnergy(能量获取方式:晒太阳)。
代码如下:
package pri.cat.studyextends;
//A种族,这里仅代表一个父类,与故事中的object类无关
public class ARace {
String race="A种族";
String protectiveTissue; //保护组织
String mobileOrgans; //移动器官
public void getSunEnergy() {
System.out.print("正在晒太阳\r\n");
}
}
再写一个调用ARace类的主函数:
package pri.cat.studyextends;
public class Demo02Extends {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ARace a=new ARace();//对象实例化,一个叫a的生物,它是a种族的
a.protectiveTissue="细胞壁";//赋值,a的保护组织是细胞壁
a.mobileOrgans="鞭毛";//赋值,a的移动器官是鞭毛
System.out.print("这个生物是"+a.race+",它有着"+a.mobileOrgans+","+a.protectiveTissue+"\r\n");//生成生物档案
a.getSunEnergy();//a的行为,它正在干什么呢?
}
}
题外话:创建对象与赋值时,有种创世主的感觉有木有?
运行:
这样,一个名叫a的对象就诞生啦,下面创造一个进化后的b种族的对象。
还是先建一个BRace类,继承ARace的变量与方法,除此之外,还多了stomach(消化器官)和吞噬的行为:
package pri.cat.studyextends;
public class BRace extends ARace{
String race="B种族";
String stomach;
public void getARaceEnergy() {
System.out.print("正在吞噬A种族生物\r\n");
}
}
在主函数中,创建一个b种族对象:
package pri.cat.studyextends;
public class Demo02Extends {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ARace a=new ARace();//对象实例化,一个叫a的生物,它是a种族的
a.protectiveTissue="细胞壁";//赋值,a的保护组织是细胞壁
a.mobileOrgans="鞭毛";//赋值,a的移动器官是鞭毛
System.out.print("这个生物是"+a.race+",它有着"+a.mobileOrgans+","+a.protectiveTissue+"\r\n");//生成生物档案
a.getSunEnergy();//a的行为,它正在干什么呢?
System.out.print("***********************\r\n");
BRace b= new BRace();//对象实例化,一个叫b的生物,它是b种族的
b.protectiveTissue="加强细胞壁";//赋值,b的保护组织是加强细胞壁
b.mobileOrgans="蹼型裙边";//赋值,b的移动器官是蹼型裙边
b.stomach="强大消化腔";//赋值,b的消化器官是强大消化腔
System.out.print("这个生物是"+b.race+",它有着"+b.mobileOrgans+","+b.protectiveTissue+","+b.stomach+"\r\n");//生成生物档案
b.getSunEnergy();//b的行为,它正在?
b.getARaceEnergy();//b的行为,它正在?
}
}
运行一下:
可以看到,在BRace类中,并没有写关于ARace的属性和方法,但是在创建对象打印运行后,仍然是保留ARace的特性的,这就是继承。
如果看到这里的你感觉好像懂了但又好像没懂,那么不如自己动手来创建一个C种族的对象:
CRace类
package pri.cat.studyextends;
public class CRace extends ARace{
String race="C种族";
String attackOrgans;
}
主函数:
package pri.cat.studyextends;
public class Demo02Extends {
public static void main(String[] args) {
// TODO 自动生成的方法存根
ARace a=new ARace();//对象实例化,一个叫a的生物,它是a种族的
a.protectiveTissue="细胞壁";//赋值,a的保护组织是细胞壁
a.mobileOrgans="鞭毛";//赋值,a的移动器官是鞭毛
System.out.print("这个生物是"+a.race+",它有着"+a.mobileOrgans+","+a.protectiveTissue+"\r\n");//生成生物档案
a.getSunEnergy();//a的行为,它正在干什么呢?
System.out.print("***********************\r\n");
BRace b= new BRace();//对象实例化,一个叫b的生物,它是b种族的
b.protectiveTissue="加强细胞壁";//赋值,b的保护组织是加强细胞壁
b.mobileOrgans="蹼型裙边";//赋值,b的移动器官是蹼型裙边
b.stomach="强大消化腔";//赋值,b的消化器官是强大消化腔
System.out.print("这个生物是"+b.race+",它有着"+b.mobileOrgans+","+b.protectiveTissue+","+b.stomach+"\r\n");//生成生物档案
b.getSunEnergy();//b的行为,它正在?
b.getARaceEnergy();//b的行为,它正在?
System.out.print("***********************\r\n");
CRace c=new CRace();//对象实例化,一个叫c的生物,它是c种族的
c.protectiveTissue="细胞壁";//赋值,c的保护组织是细胞壁
c.mobileOrgans="鞭毛";//赋值,c的移动器官是鞭毛
c.attackOrgans="尖刺";//赋值,c的攻击器官是尖刺
System.out.print("这个生物是"+c.race+",它有着"+c.mobileOrgans+","+c.protectiveTissue+","+c.attackOrgans+"\r\n");//生成生物档案
c.getSunEnergy();//c的行为,它正在干什么呢?
}
}
运行一下:
由此看来,CRace类是ARace类继承过来的,与Brace类一点关系都没有,b的独有属性与行为,c都没有。如果硬要说的话,b(子)与c(子)顶多算是兄弟,都有a(父)的特性。
也变相证明了,一个父类可以有多个子类。
主要内容就是这些啦,啰嗦了一堆,只是简单的将最基础的继承说明了一下,主要是想帮助大家(也帮助自己)从侧面理解继承。如果哪里比喻不对,或是有漏洞,欢迎大家补正,这个小故事也会持续更新,继续帮助大家理解java世界~