Java—抽象类与接口

Java—抽象类与接口

在说抽象类与接口之前,我想先介绍抽象方法:这种方法仅有声明而没有方法体。例如:abstract void f();

包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为是抽象的(否则编译器会报错)。

与之对应,接口中的每一个方法都只是一个声明,这是编译器所允许的在接口中唯一能存在的事物。


1.抽象类(abstract class)

相比于普通类,抽象类有以下特点:

  • 抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public
  • 抽象类不能用来创建对象(不能实例化)
  • 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类

抽象类中可以存在成员方法的实现细节,但是成员方法的类型不能是static类型(前面说过抽象类不能实例化,其实就是不能给它分配内存空间,而static在实例化之前就已经分配了空间,这样就自相矛盾了)。
例如:

abstract class OutAbstractClass{
    public abstract int add(int a,int b);

    public int sub(int a,int b) {
        return a - b;
    }

}

public class AbstractClassAndInterface extends OutAbstractClass{

    public int add(int a,int b) {
        return a + b;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a = 5,b = 2;
        AbstractClassAndInterface test = new AbstractClassAndInterface();
        System.out.println("a+b的结果是:"+test.add(a, b));
        System.out.println("a-b的结果是:"+test.sub(a, b));

    }

}

2.接口(interface)

接口中可以含有变量和方法,但是,接口中的每个变量都会被隐式地指定为public static final 变量,而方法会被隐式地指定为public abstract 方法,并且接口中的所有方法都必须是抽象方法。

我们会发现,抽象类与接口还是有共同点的。一个类只能继承一个抽象类,但可以实现多个接口,从而实现多重继承。并且无论是抽象类还是接口,继承或实现其的子类必须实现它们中的抽象方法。
例如:

interface OutInterface{
    int add(int a,int b);
    int sub(int a,int b);
}

public class AbstractClassAndInterface implements OutInterface{

    public int add(int a,int b) {
        return a + b;
    }

    public int sub(int a,int b) {
        return a - b;
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a = 5,b = 2;
        AbstractClassAndInterface test = new AbstractClassAndInterface();
        System.out.println("a+b的结果是:"+test.add(a, b));
        System.out.println("a-b的结果是:"+test.sub(a, b));

    }

}

猜你喜欢

转载自blog.csdn.net/wintershii/article/details/80560627