接口和抽象类

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 鸟儿 风筝 只要你需要都可以使用。
所以抽象类面对一个相似有共性的群体,接口则不必考虑。

参考《大话设计模式》

你可能感兴趣的:(接口,抽象类)