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));
}
}