快速掌握Java 面向对象编程抽象类和接口

 

一、抽象类

在之前的java教程中,我们说到Java 一篇搞定面向对象中的多态 每个子类都可以覆写父类的方法,子类对象可以覆写父类的方法。又因为子类的内容功能比父类的丰富,如果父类的方法中没实际的意义,也不能去掉,否则会无法编译。 如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法。 把一个方法声明为abstract,表示它是一个抽象方法。被定义为抽象方法之后就不能实例话了,所以就无法编译Man类,解决方法是把类也变成抽象类。

例如:

abstract class Man{
    public abstract void run();
}

需要注意的是,因为抽象类本身被设计成只能用于被继承,相当于定义了“规范”,因此在子类中也必须覆写该抽象类的抽象方法。

二、面向抽象编程

我们定义了抽象类,以通过抽象类类型去引用具体的子类的实例,这个过程不用担心抽象类下的方法,因为方正那个抽象方法只是「规范」,并不能真正执行。

public class Main {
    public static void main(String[] args) {
//    通过抽象类Man类型去引用具体的子类的实例
    Man i = new Student();
    Man j = new Teacher();
//    不关心Man变量的具体子类型:
    i.run();
    j.run();
//    Student
//    Teacher

    }
}
    
abstract class Man{
public abstract void run();
}

//继承Man类
class Student extends Man {
@Override
//继承Man类方法
public void run() {
System.out.println("Student");
}
}

class Teacher extends Man {
@Override
public void run() {
System.out.println("Teacher");
}
}

三、接口

Java 中,抽象方法本质上是定义接口规范,也就是高层类的接口,所以所有子类都有相同的接口实现。 如果一个类中没有字段,全部都是抽象方法,可以把这个类定义为接口。用interface声明。抽象类还要抽象的纯抽象接口。在这种情况下去实现实例化时,需要使用implements关键字。 需要注意的是,我们的类不能继承多个类,却可以实现多个接口。继承的接口之间用【,】都好隔开即可。

例如:

interface Man{
// public abstract void run();
void run();
}

interface Say{
// public abstract void run();
void say();
}

//继承Man类
class Student implements Man,Say{
@Override
public void run() {
System.out.println("Teacher");
}
@Override
public void say() {
System.out.println("hello");
}
}

四、接口继承

和类继承相似,接口也是可以继承的,用extends关键字,它相当于扩展了接口的方法。

五、default方法

经过以上的学习,我们已经知道接口下面的抽象方法是接口规范,所以如果后来再在接口下面追加一个抽象方法进去,编译会出错,因为实例接口的地方没有用到这个新追加的方法。所以为了解决这个问题,java接口中可以使用default定义方法,目的是让追加的接口方法可以不用在子类中全部修改,只需要在需要覆写的地方去覆写新增方法。 例如:

interface Man{
// public abstract void run();
void run();

//default 新增的方法
default void hi() {
        System.out.println("hi");
    }

}
本文为博主原创文章,知识共享,开源精神,转载注明出处。