文章目录
写在前面
我们要来学习一些更加抽象的东西了,我们学习了多态,知道了什么是动态绑定,不过这还不够,我们一起来看看抽象类,同时我们一起学习什么是接口
抽象类
看看下面的代码
class Shape {
public void draw() {
}
}
class Triangle extends Shape {
@Override
public void draw() {
System.out.println("打印一个🔺");
}
}
我们在多态里面看到了这个代码,发现class shape里面的draw方法没有用,我们是不是可以不实现这个方法,就把它声明一下,我们在Java中是可以做到的,这就是抽象方法。我们需要abstract来修饰(在访问修饰限定前后都一样)
抽象类的特点
- 抽象类不能实例化
- 它生来就是要被继承的
- 抽象类里面可以存在普通成员和方法
- 一个普通类继承了抽象类,必须重写所有的抽象方法
- 但是仍然可以发生向上转型
- 一个抽象类A继承了抽象类B,那么这个抽象类B的抽象方法
- 要是这个A才被抽象类继承,抽象类要重写A和B中所有的抽象方法
- 抽象类不能被final修饰,也就是抽象方法也不能
说到这里,抽象类还有一些很古怪的特点,我们一起来看看吧.要是一个抽象类继承了一个抽象类会怎们样?
不会发生报错
不过要是一个抽象类A继承了抽象类B,那么这个抽象类B的抽象方法,要是这个A才被抽象类继承,抽象类要重写A和B中所有的抽象方法
接口
接口有是比抽象类还要抽象的知识,我们来看看吧
接口的特点
接口使用interface修饰的,下面就是一个接口
interface IShape {
public abstract void draw();
default public void func() {
}
}
- interface 修饰
- 接口当中的普通方法,不能有具体方法的实现,要是非要有,必须加一个default来修饰
- 可以存在成员变量,但是必须初始化
- 接口可以存在static修饰的方法
- 接口里面所有的方法都是public的,可以省略,抽象方法还可以继续省略abstract
- 不可以实例化,但是可以向上转型
- 类和接口之间的关系是通过implements实现
- 普通类必须重写接口所有的抽象方法,default修饰的不用,当然这种也可以重写
- 普通类重写接口的抽象方法,访问修饰限定符必须是 public
- 一个类可以通过extends继承一个类或者抽象类,但是implements实现多个接口,接口之间 使用逗号隔开.
- 接口与接口之间之间是extends关系,意味拓展,也要"父债子尝"
interface IA {
void a();
}
interface IB {
void b();
}
class C {
}
class D extends C implements IA,IB {
@Override
public void a() {
}
@Override
public void b() {
}
}
@Override
public void a() {
}
@Override
public void b() {
}
}
[外链图片转存中...(img-aFUeR7hf-1648390837753)]
>接口与接口之间之间是extends关系
[外链图片转存中...(img-a50OoUYj-1648390837754)]