java——抽象类和接口有什么区别

Java
262
0
0
2022-11-26

抽象类

在运行时多态/动态绑定中通常会有些类中的方法没有具体的实现,而是在在被子类继承和重写之后才会安排具体的执行方法

下面的代码就是以上所提到的情况:

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)

abstract class Shape {
	abstract public void draw();
}
注意事项
  • 1.抽象方法一定包含再抽象类中
  • 2.抽象类不能被 实例化
  • 3.抽象类主要就是用来被继承的
  • 4.如果一个类继承了这个抽象类,这个类必须重写抽象类中的抽象方法
  • 5.当抽象类A继承抽象类B,抽象类A可以不重写B中的方法,但是一旦抽象类A要是在被C继承继承,那么就一定要在C中重写这个抽象方法
  • 6.抽象类或者抽象方法一定不能被final修饰的

接口

接口是抽象类的更进一步. 抽象类中还可以包含非抽象方法, 和字段. 而接口中包含的方法都是抽象方法, 字段只能包含 静态常量

以下代码是使用接口的:

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.只要这个类实现了该接口,那么你就可以进行向上转型