抽象就是提取出事物之间的共性,即个体所属的类别的共有属性和方法。
比如我们要设计一个ArrayList容器,它的底层是用数组实现,并且能够实现当容量不足时,申请一个更大的数组,将原数组的内容复制过去。
首先,分析出ArrayList是属于容器,那么我们要抽象出容器的共性。
即一个Collection接口,然后再让ArrayList类继承这个接口,即类的实现要依赖于抽象来实现。
然后使用的时候是这样子使用Collection<E> container = new ArrayList<E>();(因为Collection抽象出了容器的共性),
那么只要将new ArrayList<E>() 改成 new Set<E>()即可。
public interface Collection<E> implements Iterator{
public int size();
public isEmpty();
public void add(E e);
public void remove(E e);
public void clear();
public Iterator<E> iterator();
.......
}
public class ArrayList<E> implements Collection<E>{
public int size();
public isEmpty();
public void add(E e);
public void remove(E e);
public void clear();
public Iterator<E> iterator();
.......
private int capacity;
private E[] dataContainer;
public ArrayList();
public int getCapacity();
public void remove(int index);
public add(E e, int index);
}
封装是将对象的属性和行为绑到一起的机制,并且尽可能的隐藏内部的属性和实现。
并且向外提供接口,接口反映了该类的功能。
这样子的好处是,只能通过给定的接口修改类的属性,这样子大大提高了程序的健壮性。
并且类内部的实现和外部的展示所用到的数据类型可能不一样,类的内部可以随意修改,只要提供的接口不变即可,这样子大大提高了程序的灵活性。
public class People{
private String name;
private int age;
public People(String name, int age){
setName(name);
setAge(age);
}
public String getName(){
return name;
}
//属性封装起来,通过特有的接口设置属性,处理一些意外的取值,增强健壮性
public void setName(String name){
if(name==null)
//做出某些提示信息
else
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
if(age<0 || age>150)
//年龄超出可能的取值范围,做出某些提示信息
else
this.age = age;
}
}
封装使得我们使用类的时候不关心类的内部实现,只关心它的接口,这和客观世界一样,我们使用某种东西,只关心它的功能,而不关心它是怎么实现的。
抽象的原则是舍弃事物的特性,提取其共性。如果不考虑事物的特性,那么就不能反映客观世界中的层次关系。
所以继承是是在抽象(共性)的基础上,重新考虑抽象过程中舍弃掉的那部分事物的特性。继承的优点
1、相比不使用继承的类,派生类的描述更加简洁。(我们立志于设计小巧的类,这样更容易于理解)
2、实现代码复用
3、使得程序易于维护和扩展,(暂时不明白,等我学了工厂模式来举个栗子说明)
多态是不同事物对同一个消息(方法)做出不同不同的反应的能力(函数体)。多态是建立在继承和父类引用指向子类引用的基础上。
上面那个ArrayList和Set的例子就说明了多态。
原文地址:http://blog.csdn.net/u012501262/article/details/46502953