软件开发前,首先要对需求进行对模块进性划分,而模块划分最重要的就是把每个模块抽象成类。这也是面向对象编程的最基本思想——一切都看成类。而进行类的设计,最重要的是规定每个类中的属性和方法。
Java中可以用抽象类和接口强制规定其子类必须实现的方法。
例如:定义一个抽象类Person,其中有一个抽象方法getDescription(); Student继承了Person类,那么Student类中必须实现getDescription();方法,否则编译过不去。
abstract class Person {
public abstract String getDescription();
}
public class Student extends Person{
@Override
public String getDescription() {
return null;
}
}
再如:定义一个接口Describe,其中有一个方法getDescription(); Student实现了Describe接口,那么Student类中必须实现getDescription();方法,否则也编译过不去。
public interface Describe {
public String getDescription();
}
public class Student implements Describe{
@Override
public String getDescription() {
return null;
}
}
既然抽象类和接口的功能相同,那么为什么在Java中两者都存在呢?
这是因为,Java只支持单继承。如果某一子类只有一个父类,那么用抽象类规定其子类必须实现的方法是没有问题的,但某一子类需要从两个父类继承下来,在Java中不能被实现。
上例中,Student类继承了Person类,因为“学生”是“人”的子类,若Student类还要继承School类,School类中定义了学生成绩、班级等一些属性和方法。这在Java中是无法实现的。
abstract class School {
public abstract String getClassRoom();
public abstract String getScore();
}
解决的方法是将School声明为接口:
public interface School {
public abstract String getClassRoom();
public abstract String getScore();
}
则Student类如下,即必须实现接口Describe中的方法,也必须实现接口School中的方法。
public class Student implements Describe, School{
@Override
public String getDescription() {
return null;
}
@Override
public String getClassRoom() {
return null;
}
@Override
public String getScore() {
return null;
}
}
综上,抽象类和接口都是规定其子类必须实现的方法。在只有一个父类时,抽象类和接口的作用基本相同。接口是为了解决Java中不支持多继承的问题。
其他一些问题:
1.父类与子类引用的问题:
父类的对象可以引用一个子类的对象。例如Person类,Student是其子类。
Person p;
p = new Student ();
因为p为Person的对象,它具有Person中的属性和方法,而Student类继承了Person类,也就是说Student包括了Person类中所有的属性和方法,在p.method()时,Student类中的方法,在Person中肯定是有的,所以可以将new Student() 赋给p。而反过来却不行,Student s; s = newPerson(); s.method() 时,Person类中有Student类中没有的方法。s.method()可能调用不到方法。
2. 接口变量
经常看到这种写法 List<String> list = new ArrayList<String>();
List是个接口,ArrayList是实现了List接口的类。因为接口不是类,不能使用new运算符实例化一个接口 list = new List(); 但却能声明接口变量 List list; 接口变量必须引用实现了接口的类对象 list = new ArrayList();
这样做的好处是:调用接口中的方法、而非类中的实现方法。编写程序时,经常会用到第三方的类库,在类库中会返回一个列表(List),但未必会返回一个ArrayList,那么用这种方式就不需要了解是什么实现类,把它当List接收过来就可以了。这提高程序的透明性,让底层的实现对上层使用者封装。这是面向接口的编程。
面向对象是指,我们考虑问题时,以对象为单位,考虑它的属性及方法。
面向过程是指,我们考虑问题时,以一个具体的流程(事务过程)为单位,考虑它的实现。
欢迎批评指正!