一、抽象类
什么是抽象类,简单讲抽象类就是包含抽象方法的类。
抽象类在普通类的基础上增加了一些抽象方法,所谓抽象方法就是只做声明而没有实现的方法(即没有方法体)。
1、定义和使用
抽象类一定要使用abstract关键字来定义,而且抽象类中的抽象方法也要加abstract关键字。
示例:定义简单抽象类
abstract class Person{
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
//抽象方法,只声明不实现
public abstract void print();
}
2、使用抽象类需要注意以下几点:
1)抽象类中的抽象方法是没有方法体的,因此抽象类不能直接实例化
2)抽象类的对象可以通过对象多态性利用子类为其实例化
3)非抽象类继承了抽象类,那么这个类必须重写抽象类的抽象方法;
抽象类继承了抽象类,那么作为派生类的抽象类可以不实现基类抽象类的抽象方法。
示例:非抽象类继承抽象类,子类必须实现抽象方法
abstract class Person{
private String name;
private int age;
//抽象方法,只声明不实现
public abstract void print();
}
class Student extends Person{
//子类必须实现抽象方法
public void print() {
System.out.println("实现抽象方法");
}
}
public class Demo2 {
public static void main(String[] args) {
Person student = new Student();
student.print(); //调用
}
}
4) private 和 abstract 不能同时使用(抽象方法使用private定义不能被覆写)
final 和 abstract 也不能同时使用(抽象类使用了final不能被继承)
二、接口
1、接口的定义:
接口就是抽象方法和全局常量的集合,在Java中接口使用interface关键字定义。
接口中只允许public权限。数据成员默认为 public static final,方法默认为public abstract。
示例:
interface function {
/*public static final int count =10;
public abstract void func();*/
//保持代码简洁
int count =10;
void func();
}
2、使用注意事项:
1) 接口不能直接进行实例化,子类如想使用接口,必须使用 implements 实现
2) 接口可以使用extends继承多个接口,此时的接口拥有了继承的接口里面的抽象方法。
3) 如果抽象类继承了接口,那么抽象类当中可以不实现接口的方法;
但是如果普通类继承了接口,那么普通类一定要实现接口的方法。
4) 当一个子类既需要实现接口又需要继承抽象类时,先使用extends继承抽象类,再使用implements实现接口。
5)一个抽象类可以使用implements实现多个接口,但是接口不能继承抽象类。
示例:子类继承抽象类和实现接口。
interface Function {
void func();
}
abstract class Print{
public abstract void print();
}
//类Test先继承抽象类Print,然后实现接口Function
class Test extends Print implements Function{
public void func() {
System.out.println("func()");
}
public void print() {
System.out.println("print()");
}
}
public class Demo {
public static void main(String[] args) {
Function function =new Test();
function.func();
//test是抽象类和接口的共同子类
Print print = (Print)function;
print.print();
}
}
三、总结:
序号 | 区别 | 抽象类 | 接口 |
---|---|---|---|
1 | 结构组成 | 在普通类的基础上增加了一些抽象方法 | 抽象方法和全局常量的集合 |
2 | 权限 | 可以使用所有权限 | 只能使用public权限 |
3 | 使用 | 子类使用extends关键字继承抽象类 | 子类使用implements关键字实现接口 |
4 | 关系 | 一个抽象类可以实现若干接口 | 接口不能继承抽象类,但接口可以使用extends关键字继承多个父接口 |
5 | 限制 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |