一、抽象类的基本概念
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
抽象类可以包含零至多个普通方法,也可以含零至多个抽象方法。
二、抽象类的特征
1.包含抽象方法的类就会自动变成抽象类,必须以abstract关键字声明
2.不论抽象类是否含抽象方法,其都不允许实例化。
3.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。
4.父类是抽象类,且子类不想成为抽象类,那么子类必须将父类中的所有抽象方法重写为带方法体的普通方法,否则子类仍必须是抽象类。
三、有关抽象类的实例
步骤1:创建Subject类
import java.util.ArrayList;
import java.util.List;
public class Subject{
private List<Observer> observers
= new ArrayList<0bserver>();
private int state;
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
notifyAll0bservers();
}
public void attach(Observer observer){
observers.add(observer);
}
public void notifyAll0bservers(){
for (Observer observer : observers) {
observer.update();
}
}
}
步骤2:创建Observe类
public abstract class Observer {
protected Subject subject;
public abstract void update();
}
步骤3:创建实体观察者类
public class BinaryObserver extends Observer{
public BinaryObserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Binary String:"
+ Integer.toBinaryString( subject.getState() ) );
}
}
public class OctalObserver extends Observer{
public Octal0bserver(Subject subject){
this.subject = subject;
this. subject.attach(this);
}
@Override
public void update() {
System.out.println( "Octal String:"
+ Integer.toOctalString( subject. getState() ) ) ;
}
}
public class Hexa0bserver extends Observer{
public Hexa0bserver(Subject subject){
this.subject = subject;
this.subject.attach(this);
}
@Override
public void update() {
System.out.println( "Hex String:"
+ Integer.toHexString( subj ect. getState() ). toUpperCase() ) ;
}
步骤4:使用S subject和实体观察者对象
public class ObserverPatternDemo {
public static void main(String[] args) {
Subject subject = new Subject();
new Hexa0bserver(subject);
new Octal0bserver(subject) ;
new Binary0bserver(subject);
System.out.println("First state change: 15");
subject.setState(15);
System.out.println("Second state change: 10");
subject. setState(10) ;
}
}
步骤5:执行程序,输出结果
First state change: 15
Hex String: F
Octal String: 17
Binary String: 1111
Second state change: 10
Hex String: A
Octal String: 12
Binary String: 1010
四、接口
·接口定义的通用格式
public interface 接口名称
{
(方法头...)
}
·接口特点:接口中的所有方法都是public,抽象方法;一个类可以实现一个或者多个接口。
五、抽象类与接口的比较
接口和所有方法都是抽象方法的抽象类非常类似。
·它不能被实例化
·在接口中所列的所有方法必须在别处被重写。
从语法层面