抽象类的定义
- abstract可以用来修饰方法也可以修饰类,被abstrcat关键词修饰的类或方法都是抽象的
- 抽象类中可以有普通方法或抽象方法,但抽象方法一定存在于抽象类中
- 抽象类不可以使用new关键词来创建对象,只能通过继承方式
- 抽象方法没有方法的声明和方法体,只能由子类继承并重写来实现
- 若子类继承抽象类,子类就必须重写抽象类中所有的方法,要么子类也是抽象类
- 虽然抽象类无法创建对象,但是抽象类存在构造器
父类Father
// 父类是抽象类
public abstract class Father {
// 抽象方法,没有方法的声明实现
public abstract void sleep();
// 普通方法
public void eat(){
System.out.println("eat");
}
}
子类Son
// 子类继承父类
public class Son extends Father{
// 子类继承抽象父类必须重写父类中的方法
@Override
public void sleep(){
System.out.println("sleep");
}
@Override
public void eat(){
System.out.println("sleep");
}
public void play(){
System.out.println("play");
}
}
测试类Application
public class Application {
public static void main(String[] args) {
// 子类调用抽象类父类的方法
Son son = new Son();
Father father = new Son();
son.sleep();
son.eat();
((Son) father).play();
}
}
结果为:
sleep
sleep
play
接口的定义
- 普通类:只有具体的实现(面向对象)
- 抽象类:具体实现和抽象方法(规范)都有
- 接口:只有规范
接口使用interface关键字来定义,同抽象类的定义类似,不过不作为类的Java文件,因此不能使用Class关键字来修饰,定义接口的基本格式如下:
[修饰符] interface 接口名{
[public] [static] [final] 常量;
[public] [abstract] 方法;
}
定义两个接口UaerService及ExploitationService
public interface UserService {
// 常量 public static final 关键词可不使用,在接口中定义常量时默认定义
public static final String name = "张三";
// 方法 public abstract 关键词可不使用,默认定义为抽象方法
public abstract void add();
public abstract void delete();
public abstract void update();
public abstract void query();
}
public interface ExploitationService {
void sleep();
}
实现接口的类UaerServiceImpl
public class UserServiceImpl implements UserService, ExploitationService {
// 使用implements 实现接口时就必须重写接口内的方法,接口可以多实现(继承)
@Override
public void add() {
}
@Override
public void delete() {
}
@Override
public void update() {
}
@Override
public void query() {
}
@Override
public void sleep() {
}
}
抽象类与接口的相同点与不同点
- 相同点:
- 两者都是抽象的,都具有抽象方法,
- 都无法被实例化
- 都需其他类(子类)重写方法来实现
- 区别:
- 抽象类只能单继承,接口可以多实现(继承)
- 抽象类定义使用abstract修饰,子类使用extends继承实现.接口定义使用interface修饰,其他类使用implement实现接口
- 抽象类是类有构造方法,接口不是类没有构造器
- 抽象类可以有具体方法和抽象方法,接口只有抽象方法