Java中抽象类与接口
Java抽象类
在java中定义抽象类使用abstract关键字,具体用法如下:
abstract class AbstractClassName{
}
需要注意的是,定义一个抽象类的类名应该使用Abstract或者Base开头,这是一个约定。
抽象类是不能被实例化的,也就是说无法通过new关键字实例化对象,但是抽象类是可以有子类的,也就是说抽象类支持继承,例如如下:
public class SubAbstractClassName extends AbstractClassName {
}
此外,如果需要在普通类里面定义抽象方法,这个类也需要使用abstract关键字修饰,例如如下:
public abstract class ClassName{
abstract void eat();
void doing(){
}
}
如果父类是一个是一个抽象类,那么它的子类在继承这个父类的同时必须要实现父类的抽象方法,例如如下:
public abstract class AbstractClass{
void eating();
}
piblic SubClass extends AbstractClass{
@Override
void eating(){
...
}
}
抽象类的应用场景
第一个场景
我们希望一个通用的功能能够被子类重复使用;
第二个场景
我们在抽象类中定义好API,然后在子类扩展中实现的时候就可以使用抽象类;
Java接口
在java中,接口通过interface关键字来定义接口,接口里面可以定义常量、静态方法、抽象方法、默认方法,例如:
public interface Interface{
public static final Stirng GLOBAL_ID=65535;
public abstract void eat();
public static void sleep(){
sleep=!sleep;
}
public default void goWork(){
...
}
}
在java接口中,接口是不允许被实例化的,也就是说,不允许通过new关键字实例化接口对象。接口必须被实现然后才可以被实例化,例如:
public interface Interface{
}
public class InterfaceInstance implements Interface{
...
}
public class MainClass{
public void instance{
new InterfaceInstance();//.....
}
}
抽象类与接口的区别
- 抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
- 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
- 接口中不能含有静态代码块,而抽象类可以有静态代码块;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口。