Java之旅No.4:Java的继承(0)

来源:互联网 发布:网上商城源码 java 编辑:程序博客网 时间:2024/06/08 00:21

顺德容桂

一些想法

在工地甚是无聊,所以跑到20楼欣赏下容桂的景色,拍了这张照片。就是这片弹丸土地,诞生一个千亿小镇的奇迹,四十年风风雨雨,砥砺前行,收获了今天的成就。生活在这片土地上多年,对它未来充满希望。自己也想着,未来要为这里的发展做出贡献。但是,与对家乡发展充满信心的心态相比,我对自己的未来却是一片的迷茫,不知方向。这段时间,一直觉得自己大学的前两年时间都花在了错误的方向上,专业与兴趣之间的不断徘徊,如何跳出这个坑,如何面对当下与未来的生活压力,让我很是焦虑不安。在工地的这段日子,也发现了自己的几个缺点,性格使然吧。其一是不敢放手,选择了一些错误的事情不敢做出改变。最近一直觉得在浪费时间,很是难受。也不能说自己不愿意吃苦,吃苦能让一个人成长,但这些苦感觉就是白吃??
有时很是很是不甘心,我不甘心当下,我是一个顺德人,我想享有这个标签下所该有的东西。我知道我不该羡慕,我不该抱怨。想要改变这苦逼现实,很大程度上要靠自己的努力。我是一个城市人,我应该拥有城市人该拥有的气质、素质与认知,去奋斗追求更高的社会地位,保持一种优越感。无知,幼稚,想太多,执行力低,拖延是我的一些缺点,是我前进的一大阻力,我怕是忘了年初的目标了:让自己变成熟。前段时间经历了些打击,最近又没啥值得开心的事情,所以心情不少低迷。
能怎样,勿忘初心,继续前进,撸起袖子加油干!
这是我心中的一些想法,大家怎么看我说的这些话呢,欢迎后台留言。咳咳,港佐甘多,入正题吧( ̄▽ ̄)~*

真不知道怎么起标题名

话说这个标题名该怎么取,大家给点意见呗 ̄▽ ̄ 下面是内容:
昨天讲了下Java面向对象三大特性中的封装,今天来聊一下:继承。今天跟昨天用一样的手法,通过一个sample来引出主题,避免直接说概念,那样我也找不到写下去的思路,新手学着也会觉得难接受。
参考网络课程:
Java语言程序设计进阶【浙江大学 翁恺】(http://mooc.study.163.com/course/ZJU-1000004001#/info)
Java入门第二季(http://www.imooc.com/learn/124)
参考书籍:《Java语言程序设计 基础篇》
好,看sample

This is a sample

现在是移动互联网的时代,我们想要听什么歌,看什么剧,通过互联网,很容易能够找到。但是,在这个时代之前(哈哈,我小时候)在那个互联网还未如此壮大的时候,人们大多通过CD、DVD等介质来获取自己想要欣赏的娱乐的东西。那么,假设小明的爸爸存有大量的CD与DVD,现在,我们设计一个程序,来记录小明爸爸存有的CD、DVD的信息。
我们先来记录那些CD:
CD这个类拥有的字段与方法(右侧一栏代表数据类型或返回值):
 CD拥有的字段与方法
代码如下 ↓↓↓↓↓↓

public class CD {//记住上一篇文章的知识:最好将数据域声明为私有的    private String title;    private String artist;    private int numberOfTrack;//曲目数    private String comment;    private boolean isAccess;//是否能够使用    public CD(String title, String artist, int numberOfTrack, String comment, boolean isAccess) {        this.title = title;        this.artist = artist;        this.numberOfTrack = numberOfTrack;        this.comment = comment;        this.isAccess = isAccess;    }    public void print(){        System.out.printf("%s%12s\n",title,artist);    }}

好,跟着我们创建一个DataBase类,通过ArrayList这个集合类来存储这些CD。↓↓↓↓↓↓

public class DataBase {    private ArrayList<CD> cdList = new ArrayList<CD>();    public void add(CD cd){        cdList.add(cd);    }    public void list(){        for(CD cd:cdList){            cd.print();        }    }}

这样,设计好了两个类,通过Database的main函数来使用。

    public static void main(String[] args) {        DataBase db = new DataBase();        db.add(new CD("安和桥北", "宋冬野", 11, "安和桥好听", true));        db.add(new CD("天后", "陈势安", 8, "好听", true));        System.out.printf("%s%12s\n","title","artist");        System.out.println("------------------");        db.list();    }

添加了两张专辑进去,输出结果如下:

好,同理,我们做一个DVD。DVD与CD相似,不同的是DVD没有artist没有numberOFtracks有director。代码如下↓↓↓↓↓↓

public class DVD {    private String title;    private String director;    private String comment;    private boolean isAccess;    public DVD(String title, String director, String comment, boolean isAccess) {        this.title = title;        this.director = director;        this.comment = comment;        this.isAccess = isAccess;    }    public void print(){        System.out.printf("%s%18s\n",title,director);    }}

DataBase那里也同理啦,DataBase上实例化一个的ArrayList来存DVD,代码就懒的再写了,跟CD的差不多。。。我懒╭(╯^╰)╮别怪我
嗯,下面就开始发现,这些代码到底有什么问题呢???我们来对比一下DVD跟CD这两个类,看图吧↓↓↓↓↓↓

通过比较就发现了,这两个类有许多相同的东西。这里就犯了编程中的一个大忌:代码复制。我在编写DVD类的时候,绝大一部分代码都是从CD中复制粘贴过去的。这会导致什么问题呢?这样代码,可维护性非常的差,想修改一个功能就必须对多处进行相同的修改。而且这样的代码不具有可扩展性。怎么解决这个问题呢,我们不妨把他们相同的东西都拿出来,创建一个新的类Item↓↓↓↓↓↓

public class Item {    private String title;    private String comment;    private boolean isAccess;    public Item(String title, String comment, boolean isAccess) {        this.title = title;        this.comment = comment;        this.isAccess = isAccess;    }    public void print(){    }}

这样子我们抽出了代码相同的部分,CD和DVD就得到了简化,,代码如下↓↓↓↓↓↓
CD.Java:

public class CD extends Item{    private String artist;    private int numberOfTrack;//曲目数    public CD(String title, String artist, int numberOfTrack, String comment, boolean isAccess) {        super(title,comment,isAccess);        this.artist = artist;        this.numberOfTrack = numberOfTrack;    }    @Override    public void print() {        super.print();        System.out.printf("%12s\n",artist);    }}

DVD.Java

public class DVD extends Item{    private String director;    public DVD(String title, String director, String comment, boolean isAccess) {        super(title,comment,isAccess);        this.director = director;    }    @Override    public void print() {        super.print();        System.out.printf("%12s\n",director);    }}

(;´д`)ゞ卧槽,这都是什么鬼,怎么会多了那么多新东西,怎么说?怎么说?怎么说?(ಥ_ಥ)我们来看张图吧:这里写图片描述
这张图说明了Item与DVD、CD的关系:Item是DVD跟CD的父类,DVD跟CD是Item的子类。也可以说DVD和CD继承了Item,在代码实现上就是public class CD extends Item and public class DVD extends Itemextend中文意思叫“扩展”,CD、DVD扩展了Item,根据这个翻译就可以去理解了下面话的意思。CD类和DVD类继承了Item所拥有的所有可以访问的数据域和方法。那就是说Item代码里有一个print(),那么,CD类里,虽然没有写,但因为它继承了item,那么,CD类就拥有了print()
不信???现在我暂时将CD中的print()注释掉,代码改成这样

//这是Item的print()public void print(){        System.out.println("这是Item的print()");}

在CD上创建main()试一下:
这里写图片描述
怎么样,是不是感觉很神奇捏。运行一下,看看能有什么效果:
这里写图片描述
由于CD继承了Item,因此,CD就能够使用Item的print()了。
额,那我们前面简化了的里面的代码是什么意思呢,既然继承了Item的print()为什么我们还有在CD上再写一个print()呢。。。这是因为我们的需求不同,CD的print()我们需要打印输出artist,DVD则需要director,所以我们必须对print()进行重新修改,这样的操作叫做方法覆盖(method overriding),我们也叫重写了父类的print()方法。
这里写图片描述
那么怎么重写呢,其实很简单,写一个跟父类相同的方法名就可以了。

    @Override    public void print() {        super.print();        System.out.printf("%12s\n",artist);    }

这里有两样新东西,@Override和super。
先讲一下这个@Override:其实这个东西可有可无,他存在的意义是告诉编译器,下面的方法是我重写父类方法,这样告诉编译器有什么用呢,加上这行代码有什么用呢,,其实,用处就是防止你写错名字了,,如果你把print()写成了prnt,编译器就会报错,说父类没有prnt这个方法,提醒你一下你是不是写过名字了,这样,在某些大工程中,就可以减少出错的几率。
super。。。这东西厉害了。。super是Java的一个关键字。它代表了父类对象的引用,不懂意思没关系,记住他的用途:super关键字的用途有两种

  1. 调用父类的构造方法
  2. 调用父类的方法

那么,super.print()就是第二种,根据我们的需求,在CD中我们既要输出artist也要输出title,输出artist在item中实现了,我们在重写print()方法中,如果想使用父类的print()方法,那么,我们就用super.print()即可
那么第一种,调用父类的构造方法怎么用呢,看我们改进后的代码:

//这是父类的构造函数public Item(String title, String comment, boolean isAccess) {        this.title = title;        this.comment = comment;        this.isAccess = isAccess;}
//这是DVD的构造函数public DVD(String title, String director, String comment, boolean isAccess) {    super(title,comment,isAccess);    this.director = director;}

嘻嘻,一看就知道怎么用了吧,这里需要认识到的是,当子类被new构造出来的时候,那么父类也会被构造出来,由于Item类构造的时候必须传参数,因此,如果构造DVD时,不适用super(),编译器就会报错,因为它无法实例化一个Item。
继承似乎很多内容,今天说不完了,下一张再说。
end…

原创粉丝点击