Java基础:第三十三讲 父类与继承

来源:互联网 发布:比初页好用的软件 编辑:程序博客网 时间:2024/05/21 22:56

现实世界中我们可以对各种对象进行分类,并且类还有一定的等级、层次,下面以大家熟悉的动物的分类为例介绍分类的特点。

动物分类学家根据动物的各种特征(形态、细胞、遗传、生理、生化、生态和地球分布)进行分类,即自然分类法,将动物依次分为各种等级。即界、门、纲、目、科、属、种等七个主要等级。其中种是分类所用的基本单位。每一种动物,都可以给它们在这个等级序列中冠以适当的名称和位置。

大熊猫,属于动物界、脊维动物门、哺乳纲、食肉目、大熊猫科、大熊猫属。

现代人类在生物分类系统中的地位是:动物界、脊索动物门、哺乳动物纲、灵长目、人科、人属、智人种。

在这个层次中,越向上抽象程度越高,是对下一层次的分类的共同特征进行了抽象,具有的属性会越少,因为抽象的过程实际上是提取共性,去除个性的过程,是下一级分类的属性的交集。

在这个层次中,在向下描述的时候是增加特征属性的过程,例如我们在描述脊椎动物的时候,脊椎动物是所有体内具有脊椎骨的动物,脊椎动物除了具有脊索动物门的三项基本特征:脊索、背神经管、鳃裂外,还具有一些其他的特征(http://baike.baidu.com/view/345393.htm)。

也就是说脊椎动物首先是动物,然后具有一些显著的特点。这样脊椎动物的属性就是动物具有的属性和脊椎动物特有的属性。

现实世界中的分类以及类的层次关系与软件系统中对象的分类和类的层次关系是相同的。

1、父类、子类、祖先类、子孙类

在类的分层中,相邻层次的类,处于顶层的称为父类,处于下面一层称为子类。

子类具有父类的所有属性,子类具有比父类更多的属性。例如脊椎动物具有动物的所有属性,而脊椎动物还具有一些特殊的属性。

如果某个对象属于子类,那他肯定属于父类。例如,人属于脊椎动物,人肯定属于动物。

父类包含更多的对象,动物除了包含所有的脊椎动物之外,还包括非脊椎动物,是对更多对象的抽象,能够表示更多的对象。

在类层次中,处于某个类之上的所有层次都可以称为当前层的祖先类。例如,动物界、脊索动物门、哺乳动物纲、灵长目都可以称为人科的祖先类。 

在类层次中,处于某个类之下的所有层次都可以称为当前层的子孙类。例如,脊索动物门、哺乳动物纲、灵长目和人科都属于动物的子孙类。

有时候使用超类来表示父类,通常情况下不需要严格区分父类与祖先类,子类与子孙类。

2、单继承与多继承

在现实世界我们按照某种方式进行分类的时候,类的层次结构通常表现为一颗倒立的树,具体下面的特点:树中的每个节点可以有1个父类或者没有父类(最顶层),可以有多个子类或者没有子类(最下层)。这种情况称为单继承。

有一些情况下,根据分类的标准可能会造成某个子类有多个父类,例如:对学校中的人员进行分类,按照工作情况分工,可以分为学生、教师、后勤,按照是否为党员划分可以分为党员和群众。这样对于一个学生党员来说,他的父类可以是学生也可以是党员,就有两个父类了。具有两个或者多个父类称为多继承。

在Java中直接支持单继承,多继承需要通过实现接口来实现,关于接口在后面介绍。

3、实现继承

通过关键字extends实现继承,例如类B继承了类A,可以写成:

public class A{

    // 父类A中的属性

}

public class B etends A{

    // B中特有的属性

}

实现继承之后B类的属性就包括B中重新定义的属性以及从A类继承过来的属性。

4、Object类

Object类是所有类的祖先类,是最顶层类。

如果某个类没有定义父类,则父类就是Object。

上面的类A没有声明父类,它的父类就是Object。

关于Object的用法在后面单独介绍。

5、抽象与派生

在3中,我们先定义了类A,在A中定义了属性。然后定义了类B,继承自类A,并增加了一些属性,这样类B的属性就包括从A中继承的属性以及重新定义的属性。这个过程称为从类A派生出类B。

如何知道父类中有哪些属性,子类中有哪些属性,要创建多少个类呢?

这是面向对象分析与设计需要完成的任务,父类的出现主要是为了让多个子类共享代码,也就是把多个子类中重复的代码提取出来形成父类,这是一个抽象的过程,抽象出各个子类共同代码。例如,学校的选课系统包含学生和教师,正常情况下我们会创建教师类和学生类,但是学生类和教师类会包含一些相同的属性和方法,例如姓名、性别、联系方式等,如果在学生类和教师类中都要维护这些信息,当某个属性发生改变的时候需要修改两个类,并且明显存在着代码重复的问题,这时候可以考虑把共同的属性和方法提取出来生成一个新类,作为学生类和教师类的父类。

下面的代码展示了这个过程:

抽象之前:

public class Student{

   public String name;

   public String studentId;

   public String class;

   public String sex;

   public String address;

   public String phone;

   //相关方法

}

public class Teacher{

 

   public String name;

   public String teacherId;

   public String department;

   public String sex;

   public String address;

   public String phone;

   //相关方法

}

抽象之后:

public class Person{

 

 

   public String name;

   public String sex;

   public String address;

   public String phone;

   // 共享的方法

}

public class Student extends Person{

   public String studentId;

   public String class;

   // 学生类特有的方法

}

public class Teacher extends Person{

   public String teacherId;

   public String department;

   // 教师类特有的方法

}

是否是所有的方法和属性都可以继承呢?哪些可以继承?请听下回讲解。

上一次:第三十二讲 静态成员
下一次:第三十四讲 包
李绪成 CSDN Blog:http://blog.csdn.net/javaeeteacher
邀请您为好友:http://student.csdn.net/invite.php?u=124362&c=7be8ba2b6f3b6cc5