类的继承
课程    Java核心技术

继承是面向对象设计的重要思想,其核心是代码的复用和程序功能高度的扩展性。继承在词典中的解释是把前人的知识、文化、思想、财产、知识等接收过来。在面向对象中,继承是对类而言的,新类可以继承已有类的属性和方法,这样做的好处是新类可以复用原有类所有的代码,复用的同时又可以定义新的方法和属性来扩展原有类的功能。

为了理解继承思想,下面看一个案例。

某出版机构准备要通过微信小程序实现产品在微信媒体的推广和销售,出版机构的产品包括图书、音频、视频,图书又分为纸书和电子书。现在需要设计产品类,该类能够存储出版社所有产品的属性(如名称、价格、作者、摘要等产品信息),并能输出产品的属性。

由案例内容分析可知,该出版机构有纸质图书、电子图书、音频、视频产品,每类产品既有共同属性,如名称、价格、作者、摘要等属性,也有个性化属性,如纸质图书有字数、页数等属性,视频有分辨率、播放时长、文件大小、编码等属性,音频有采样频率、文件大小、编码等属性,电子图书有格式、文件大小等属性。

前面我们学过抽象和封装,可以把同类事物的共同属性抽取出来形成类,既然该出版机构的纸质图书、电子图书、视频、音频产品都具有共同属性名称、价格、作者、摘要,可以创建一个Product产品类,代码如下:

public class Product {
//产品名称
String name;
//产品价格
double price;
//产品作者
String author;
//产品摘要
String summary;
   
    //构造方法
    public  Product(String inName,double inPrice,String inAuthor,String inSummary)
    {
        this.name = inName;
        this.price = inPrice;
        this.author = inAuthor;
        this.summary = inSummary;
    }
 
//输出产品属性
    public void outProduct()
    {
        System.out.println("产品名称:" + name);
        System.out.println("产品价格:" + String.valueOf(price));
        System.out.println("产品作者:" + author);
        System.out.println("产品摘要:" + summary);
    }
 
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public double getPrice() {
    return price;
}
public void setPrice(double price) {
    this.price = price;
}
public String getAuthor() {
    return author;
}
public void setAuthor(String author) {
    this.author = author;
}
public String getSummary() {
    return summary;
}
public void setSummary(String summary) {
    this.summary = summary;
}
 
}

案例代码见PcoreUnit1项目book包的Product类。

Product类声明了该出版机构产品的共同属性名称、价格、作者、摘要,并定义了输出产品属性的方法outProduct()。

但该类并没有完全实现任务要求,因为该类的属性并没有全部反映出该出版机构所有产品的属性,如纸质图书、电子图书、视频、音频产品的个性化属性。

如何解决这个问题呢,有两种解决方案,一种解决方案是每类产品都创建为一个类,该类包含该产品的所有属性,即分别创建纸质图书类、电子图书类、视频类和音频类,下面给出纸质图书类的代码:

public class PaperBook {
//图书名称
String name;
//图书价格
double price;
//图书作者
String author;
//图书摘要
String summary;
//图书字总
String words;
//图书页数
String pageNumbers;
//输出产品属性
public void outProduct()
{
    System.out.println("图书名称:" + name);
    System.out.println("图书价格:" + String.valueOf(price));
    System.out.println("图书作者:" + author);
    System.out.println("图书摘要:" + summary);
    System.out.println("图书字数:" + words);
    System.out.println("图书页数:" + pageNumbers);
}
   
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
public double getPrice() {
    return price;
}
public void setPrice(double price) {
    this.price = price;
}
public String getAuthor() {
    return author;
}
public void setAuthor(String author) {
    this.author = author;
}
public String getSummary() {
    return summary;
}
public void setSummary(String summary) {
    this.summary = summary;
}
 
public String getWords() {
    return words;
}
 
public void setWords(String words) {
    this.words = words;
}
 
 
public String getPageNumbers() {
    return pageNumbers;
}
 
public void setPageNumbers(String pageNumbers) {
    this.pageNumbers = pageNumbers;
}
}

案例代码见PcoreUnit1项目book包的PaperBook类。

例子代码仅给出了纸质图书类的代码,电子图书类、视频类和音频类可参照纸质图书类代码创建。这样创建的代码也可以完成案例任务要求,问题是创建的四个产品类中都有重复的属性和方法,代码重复,不符合面向对象的设计原则。

另外一种解决方案就是采用Java的类继承机制,利用Java的类继承机制可以让纸质图书类,电子图书类、视频类和音频类均继承于Product类,被继承的Product称为父类,继承的纸质图书类,电子图书类、视频类和音频类称为子类,子类继承父类的所有属性和方法,同时子类可以声明自己特有的属性和方法。下图给出了出版机构的产品类继承图。

image.png


产品类继承图

在Java中子类继承父类是通过extends关键字来实现继承的。可以让eclipse自动创建子类代码,展开PCoreUnit1项目,具体操作如下:

(1)用鼠标选择src目录下的book包,单击鼠标右键,在弹出的菜单项列表中选择【New】菜单项;

(2)在弹出的【New】子菜单项列表,选择【Class】菜单项;

(3)在弹出的对话框中(如下图所示),单击Superclass输入域右侧的【Browse...】按钮;

image.png


(4)在弹出的对话框中(如下图所示)Choose a type输入域,输入父类Product类名,在Matching items列表区域会列出输入的类名相关的类,选择正确的父类即可。

image.png

下面给出电子图书类、视频类的子类代码,其它子类代码请自行创建:

电子图书类代码

public class EBook extends Product {
//电子图书的格式
String  formation;
//电子图书的文件大小
long filesize;
//电子图书类的构造方法
    public EBook(String inName, double inPrice, String inAuthor, String inSummary) {
        super(inName, inPrice, inAuthor, inSummary);
        // TODO Auto-generated constructor stub
    }
 
public String getFormation() {
    return formation;
}                                  
public void setFormation(String formation) {
    this.formation = formation;
}
public long getFilesize() {
    return filesize;
}
public void setFilesize(long filesize) {
    this.filesize = filesize;
}
}

案例代码见PcoreUnit1项目book包的EBook类。

EBook类是Product类的子类,继承了Product类的全部属性和方法,也包括构造方法,Product类是EBook类的父类。程序创建Ebook对象时,需用super关键字调用父类的构造函数以初始化父类的数据,super关键字主要用于指向子类对象中的父类对象。

视频类代码

public class Video extends Product {
 
//视频分辨率
String  resolution;
//视频格式
String  formation;
    //视频文件大小
long filesize;
 
public Video(String inName, double inPrice, String inAuthor, String inSummary) {
    super(inName, inPrice, inAuthor, inSummary);
    // TODO Auto-generated constructor stub
}
 
public String getResolution() {
    return resolution;
}
 
public void setResolution(String resolution) {
    this.resolution = resolution;
}
 
public String getFormation() {
    return formation;
}
 
public void setFormation(String formation) {
    this.formation = formation;
}
 
public long getFilesize() {
    return filesize;
}
 
public void setFilesize(long filesize) {
    this.filesize = filesize;
}
}

案例代码见PcoreUnit1项目book包的Video类。

视频类代码的结构同电子图书类代码结构相同,这里就不作解释了。细心的同学可能会发现EBook类和Video类也具有共同的属性formation和filesize,可以把formation和filesize提取出来抽象为一个新的电子出版物类,电子图书类、视频类、音频类继承电子出版物类,电子出版物类又继承于产品类,从而构成产品类的层次结构,产品类层次结构如下图所示:

image.png


产品类层次结构图

类的层次结构充分体现了面向对象编程的继承思想,高度抽象出的事物(Product类)再不断细化为接近现实的事物(PaperBook类和EProduct类),EProduct类又可以细化为具体事物(EBook、Video、Audio类),层层继承,高度复用了已有代码。

面向对象的继承思想是也是一种系统设计思想,系统从高度抽象入手构建基础抽象类,基础抽象类满足系统所有类的基本属性和操作要求。所有系统类均继承于基础抽象类,继承的系统类又可以被更具体化的子类继承,从而构成了系统的类层次结构。Java语言的Objec类就是一个基础抽象类,Java所有的类都继承于Objec类,JDK就是一个很好的类层次结构例子。


读者留言
最新
推荐
子衿
2020/1/5
讲的很明白,很容易理解
  • 推荐[0]
  • |
  • 回复
回复评论
用手机学习课程

手机、电脑同步学

用浏览器扫描二维码,即可下载APP。

郎宏林
授课老师
授课老师简介
项目经理,系统分析和架构师,从事多年中文信息处理技术。熟悉项目管理、擅长项目需求分析和设计、精通Java、C#、Python等编程语言。
  • 备案号:鲁ICP备15001146号
  • @1997-2018 潍坊米粒花网络技术有限公司版权所有