1.抽象类的特性
.1 抽象类是一个虚方法,规定了子类的规范,本身不具有任何意义,所以不能实例化,必须被子类重写他的抽象方法才有意义。
.2 当我们需要一个包含抽象方法的类的时候,就必须有一个抽象类包含该方法,同时抽象类也可包括其他非抽象方法。
所以抽象类的基本结构是:
abstract class AbstractClass {
public abstract void PrimitiveOperation();
public abstract void PrimitiveOperation2();
public void templateMethod()
{
PrimitiveOperation();
PrimitiveOperation2();
System.out.println("Abstract");
}
}
public abstract class AbstractclassSon extends AbstractClass{
public abstract void method();
}
继承抽象类的子类
public class ConcreteClassA extends AbstractclassSon{
@Override
public void PrimitiveOperation() {
// TODO Auto-generated method stub
System.out.println("A1");
}
@Override
public void PrimitiveOperation2() {
// TODO Auto-generated method stub
System.out.println("A2");
}
@Override
public void method() {
// TODO Auto-generated method stub
}
}
入口:
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractClass c;
c = new ConcreteClassA();
c.templateMethod();
}
}
可见,抽象类A可有实现具体功能的类继承,也可以由抽象类B继承,这时继承B的类必须实现A和B的所有抽象方法。
2.接口的特性
接口的声明在语法上与抽象类相同,是唯一可以弄混的方面,其他方面对于JAVA而言,有明显的差异。
通过比较来说明接口特性。
类是一个对象,可以包含对象的结构特征,来规范哪些类可以继承该抽象类,比如:一个抽象类
abstract class person{
-----
abstract void hands();
abstract void feet();
void hair();
}
在JAVA中只能单继承,我们规定了这样一个person的类型,继承他可以实例化新的具体的Person类,但是我们要让这个人做一些事情,当然可以在抽象类中声明比如
abstract void eat()
但是如果这个人是超人,可以飞,那么如果在抽象类中加入飞的方法,就对每一个继承他的类造成了“负担”。所以接口的价值体现出来了。
准备一个飞的接口:
Interface IFly();
只要超人有需要可以实现它,不需要的普通人则不必理会。
这里面看出抽象类和接口的另一个差别:
抽象类是从大量子类中提取出来的共性的东西,设计一个“规范类”来约束这些子类,要求新的子类也必须有这些共性。接口则不同,接口无须理会是超人还是普通人要使用它,单纯的把这一功能预先定义出来,除了Person 鸟儿 风筝 只要你需要都可以使用。
所以抽象类面对一个相似有共性的群体,接口则不必考虑。
参考《大话设计模式》