抽象类
在运行时多态/动态绑定中通常会有些类中的方法没有具体的实现,而是在在被子类继承和重写之后才会安排具体的执行方法
下面的代码就是以上所提到的情况:
代码语言:javascript复制class Shape {
public void draw() {
}
}
class Cycle extends Shape {
@Override
public void draw() {
System.out.println("○");
}
}
class Rect extends Shape {
@Override
public void draw() {
System.out.println("□");
}
}
class Flower extends Shape {
@Override
public void draw() {
System.out.println("♣");
}
}
public class TestDemo1114_1 {
public static void main(String[] args) {
Shape shape1 = new Flower();
Shape shape2 = new Cycle();
Shape shape3 = new Rect();
drawShape(shape1);
drawShape(shape2);
drawShape(shape3);
}
// 打印单个图形
public static void drawShape(Shape shape) {
shape.draw();
}
}
在刚才的打印图形例子中, 我们发现, 父类 Shape 中的 draw 方法好像并没有什么实际工作, 主要的绘制图形都是由Shape 的各种子类的 draw 方法来完成的. 像这种没有实际工作的方法, 我们可以把它设计成一个 抽象方法(abstractmethod), 包含抽象方法的类我们称为 抽象类(abstract class)
代码语言:javascript复制abstract class Shape {
abstract public void draw();
}
注意事项
- 1.抽象方法一定包含再抽象类中
- 2.抽象类不能被 实例化
- 3.抽象类主要就是用来被继承的
- 4.如果一个类继承了这个抽象类,这个类必须重写抽象类中的抽象方法
- 5.当抽象类A继承抽象类B,抽象类A可以不重写B中的方法,但是一旦抽象类A要是在被C继承继承,那么就一定要在C中重写这个抽象方法
- 6.抽象类或者抽象方法一定不能被final修饰的
接口
接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含 静态常量
以下代码是使用接口的:
代码语言:javascript复制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();
}
}
注意事项
- 1.接口中的方法都是抽象方法 ,因此可以省略 abstract
- 2.其实可以有具体实现的方法(再jdk1,8加入的),方法前面加上default:(一般情况不用) default public void func(){}
- 3.接口中定义的成员变量默认为常量 ,需要初始化
- 4.接口中的成员变量,默认为public static final
- 接口中的成员方法默认为: public abstract
- 5.接口是不可以用来实例化
- 6.接口和类之间的关系为implements
- 7.解决java中的单继承问题,可以实现多个接口
- 8.只要这个类实现了该接口,那么你就可以进行向上转型