目录
抽象类
类与类之间的关系是继承,一个类可以继承另一个类,而有一种类存在的意义就是为了继承 抽象类
包含抽象方法(abstract method)的类就是抽象类(abstract class)
抽象方法
被 abstract 修饰的方法称为抽象方法,抽象方法没有方法体( 没有 {} ,不能执行代码)
abstract class Shape {
abstract public void draw();
}
对于包含抽象方法的类,必须加上abstract关键字表示这是一个抽象类
注意事项:
1.抽象类不能够直接实例化
Shape shape = new Shape();
// 编译出错 Error:(30, 23) java: Shape是抽象的; 无法实例化
2.抽象方法不能是private的
abstract class Shape {
abstract private void draw();
}
// 编译出错 Error:(4, 27) java: 非法的修饰符组合: abstract和private
3.抽象类中可以包含其他的非抽象方法, 也可以包含字段. 这个非抽象方法和普通方法的规则都是一样的,
可以被重写, 也可以被子类直接调用
abstract class Shape {
abstract public void draw();
void method() {
System.out.println("method");
}
}
class Rect extends Shape {
...
}
public class Test {
public static void main(String[] args) {
Shape shape = new Rect();
shape.method();
}
}
// 执行结果 method
抽象类的作用
抽象类存在的最大意义就是为了被继承
抽象类本身不能够实例化,要想使用,只能创建抽象类的子类,然后让子类重写抽象类中的抽象方法
abstract class Shape {
abstract public void draw();
void method() {
System.out.println("method");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("rect method");
}
}
public class Test {
public static void main(String[] args) {
Shape shape = new Rect();
shape.draw();
}
}
//运行结果 rect method
接口
接口是抽象类的更进一步,抽象类中可以包含抽象方法,普通方法和字段,而接口中包含的方法只能是抽象方法,而字段只能是静态常量
语法规则
- 使用interface定义一个接口
- 接口的方法一定是抽象方法,因为可以省略abstract
- 接口的方法权限一定是public,因此可以省略public
- 一个类可以 实现 一个接口,使用implements
- 在调用的时候同样可以创建一个接口的引用, 来指向一个子类的实例
- 接口不能够单独被实例化
interface IShape {
void draw();
}
class Cycle implements IShape {
@Override
public void draw() {
System.out.println("○");
}
}
public class Test {
public static void main(String[] args) {
IShape shape = new Rect();
shape.draw();
}
}
//执行结果 ○
扩展(extends) vs 实现(implements)
扩展指的是当前已经有了一定的功能了,进一步扩充功能
实现指的是当前啥都没有,需要从头构造
接口中只能包含抽象方法. 对于字段来说, 接口中只能包含静态常量(final static).
interface IShape {
void draw();
public static final int num = 10;
}
其中的 public static final 都可以省略,省略后的num仍然表示public的静态常量
提示:
1.接口的命名一般以大写字母 I 开头
2.接口的命名一般使用"形容词"
接口间的继承
类和接口之间的关系是实现(implements),而接口与接口之间和类与类之间的关系都是继承(extends)
interface IRunning {
void run();
}
interface ISwimming {
void swim();
}
// 两栖的动物, 既能跑, 也能游
interface IAmphibious extends IRunning, ISwimming {
}
class Frog implements IAmphibious {
//重写IRunning中的run抽象方法
@Override
public void run() {
System.out.println("run");
}
//重写ISwimming中的swim抽象方法
@Override
public void swim() {
System.out.println("swim");
}
}
接口间的继承相当于把多个接口合并在一起
总结
抽象类中可以包含普通方法和普通字段,这样的普通方法和普通字段可以直接被子类调用(不必重写),而接口中不能包含普通方法,子类必须重写所有的抽象方法
No | 区别 | 抽象类(abstract) | 接口(interface) |
1 | 组成 | 抽象方法+普通方法+字段 | 只含抽象方法+全局变量 |
2 | 权限 | 各种权限 | public |
3 | 子类使用 | 使用extends关键字继承抽象类 | 使用implements关键字实现接口 |
4 | 关系 | 一个抽象类可以实现若干个接口 | 接口不能继承抽象类,但是接口可以继承接口 |
5 | 子类限制 | 一个子类只能继承一个抽象类 | 一个子类可以实现多个接口 |