面试_java_抽象方法、抽象类、接口

115 阅读3分钟

抽象方法和抽象类

抽象方法

使用abstract修饰的方法,没有方法体,只有声明。 抽象方法必须为public或者protected,因为如果为private,则不能被子类继承,子类便无法实现该方法。

实例:public abstract void xxx();



抽象类

用abstract修饰,不能被实例化,必须被继承,目的是为了重写。

  • 抽象类中可以有普通方法,甚至允许全部为普通方法。

  • 抽象类可以有构造方法。并且子类对象实例化的时候,依然满足先执行父类构造,再执行子类构造的顺序。

  • 抽象类不能用来创建对象(不能被实例化)。

  • 抽象类可以继承抽象类,也可继承普通类

  • 子类继承抽象类就必须覆写抽象类之中的全部抽象方法。不然就将子类也设成抽象类。

  • 抽象类不能用private修饰,因为抽象类能继承,private又不允许继承,矛盾了

  • 抽象类不能用final修饰,因为抽象类必须有子类,而final定义的类不能有子类,矛盾了。

  • 外部抽象类不允许使用static修饰,而内部的抽象类可以使用static修饰。



Demo

//定义一个抽象类
abstract class A{

    //普通方法
    public void fun(){
        System.out.println("存在方法体的方法");
    }

    //抽象方法,没有方法体,有abstract关键字做修饰
    public abstract void print();
}

//单继承
//B类是抽象类的子类,是一个普通类
class B extends A{

    //强制要求覆写
    @Override
    public void print() {
        System.out.println("Hello World !");
    }

}
public class TestDemo {

    public static void main(String[] args) {
        //向上转型
        A a = new B();

        //被子类所覆写的过的方法
        a.print();
    }
}

运行结果:

Hello World !



接口

接口中只有抽象方法,没有构造方法,不能被实例化,但是可以被实现,并且支持多实现。想要实现接口的类,必须实现接口中的所有方法,否则就必须声明为抽象类


Demo

interface IAnimal {
    void run();
}
class AnimalImpl implements IAnimal {
    public static void main(String[] args) {
        IAnimal animal = new AnimalImpl();
        animal.run();
    }
    @Override
    public void run() {
        System.out.println("AnimalImpl Run.");
    }
}



抽象类与接口的联系与区别

相同点

  • 都不能被实例化
  • 非抽象类 想要实现接口或抽象类,都需要重写其中 所有的抽象方法 ,否则就必须声明为抽象类。

不同点

  • 一个类可以实现多个接口,但只能继承一个抽象类

  • 抽象类中可以有普通方法的实现,可以有构造方法,可以有静态方法,可以有普通成员变量;接口中只能有抽象方法的声明public static final 的变量,其他什么内容都不能有。

  • 从设计层面上来说,抽象类主要用来抽象类别,是一种模板设计;接口主要用来抽象功能(行为),是一种规范。接口的抽象级别更高。



用抽象类实现一个接口,和普通类实现接口会有什么不同么?

一般来说我们使用普通类来实现接口,这个普通类就必须实现接口中所有的方法,这样的结果就是普通类中就需要实现多余的方法,造成代码冗余。

但是如果我们使用的是抽象类来实现接口,那么就可以只实现接口中的部分方法,并且当其他类继承这个抽象类时,仍然可以实现接口中有但抽象类并未实现的方法。