复用
作为一个语言,都需要面对一个问题,就是复用。有位大牛说过,“不要重复制造轮子”。说的就是,我们的代码要尽可能的复用。
已经有的功能、算法,我们为什么要重新再思考一遍,再编写调试一遍?我们只需要拿来用岂不是更好?
如果接触过像C语言这种面向过程设计的语言,你会发现复用很简单。只需要把大家反复执行的代码,用方法提取出来,供大家调用即可。这就是方法复用。
但是现在,我们是在Java的世界里,在面向对象的世界里,在类的世界里,所有的方法和功能,都被写到了一个个类中。所以如何复用他们呢?答案是组合和继承。
组合
在Java中,类是由属性和方法组成的。
属性都是有数据类型的。除了我们熟知的基本类型外,还可以是引用类型,就是类。
当我的类中,包含了其他类型的属性,我们就称这种关系叫组合。
现实中有很多组合的例子,比如笔记本,它虽然是Apple的Macbook,但是却用了Intel的CPU,却用了华硕的主板。
Macbook.java
public class Macbook{
private Intel cpu = new Intel();
public void run(){
cpu.run();
}
}
Intel.java
public class Intel{
public void run(){
System.out.println("Intel is running");
}
}
所以,当我们生产笔记本时,可以看看,市场上有那些零部件可以采购,然后将它们 组合起来即可。不用自己再研制诸如CPU和内存之类的零件了。
同理,当我们设计类时,可以看看,Java为我们提供了那些类,然后将它们组合到类中作为属性,就可以自己的方法中调用它们的方法,以实现自己想要的功能。这就是组合。
Java为我们提供了很多类库,以便我们组合。我们在5,Java常用类进行介绍。
继承
Java提供了一个形象的概念,叫继承,extends。
孩子继承父母的特征,男人继承人的特征,正方形继承平行四边形的特征。是不是很形象,一点都不牵强。
举个例子,VIP继承自Client,所以VIP就会自动拥有Client拥有的所有特性和功能。
在VIP类中,只需要添加自己有别于一般Client的特征和功能即可。
像下面,在VIP类中,我们添加了借钱方法borrow,这样VIP除了可以取钱,存钱,还可以借钱。
我们在VIP类中,重写了取钱方法draw,让VIP有别于一般Client,可以取出超出自己的存款额的钱。
Client.java
public class Client{
protected String ID;
protected int sum;
public void save(int amount){
System.out.println("Client "+ this.ID + "is saving " + amount + "$");
this.sum = this.sum + amount;
}
public void draw(int amount){
System.out.println("Client "+ this.ID + "is drawing " + amount + "$");
if( this.sum - amount >= 0 ){
this.sum = this.sum - amount;
}
}
}
VIP.java
public class VIP extends Client{
public void borrow(int amount){
System.out.println("VIP "+ super.ID + "is borrowing " + amount + "$");
super.sum = super.sum + amount;
}
public void draw(int amount){
System.out.println("VIP "+ super.ID + "is drawing " + amount + "$");
super.sum = super.sum - amount;
}
}
注意
1,我们通过super关键字,可以在子类中,调用父类的非private的属性和方法。也就是protected的和public的属性和方法。
2,子类最多只能继承一个父类。所以Java是单继承。
3,如何覆盖父类的某些特性?重写。只需在子类中重写父类的方法即可。但final修饰的方法,不可被子类重写。
下面我们介绍
4,多态和接口
本节问题:
1,在动物园模拟系统中使用或找到组合和继承,思考为何使用并解释其好处。