进阶JAVA篇-抽象类与接口

目录

一.抽象类

        1.1用关键字abstract修饰类、方法

        1.2注意事项

二.接口

        2.1如何定义接口

        2.2接口的好处(重点)

        第一个好处,弥补了类单继承的的不足,一个类可以同时有多个接口。

        第二个好处,让程序可以面向接口编程,这样程序员就可以方便地切换各种业务实现。

三.比较抽象类与接口

        抽象类和接口的区别主要有以下几点:


一.抽象类

        为了更好的支持多态性,定义出了一个类。抽象类的一个重要作用是支持多态性。多态性是面向对象编程的一个重要特性,它允许不同的对象对同一消息做出不同的响应。

        下面根据具体的情景来认识抽象类吧,我们来实现多态的具体的项目。需要定义一个Person父类,定义两个子类分别为:TeacherStudent

代码如下:

public class Abstract {
    public static void main(String[] args){
        Person person1 = new Student();
        person1.run();

        Person person2 = new Teacher();
        person2.run();
    }
}
class Person{
    public void run(){
        System.out.println("跑");
    }
}
class Student extends Person{
    @Override
    public void run(){
        System.out.println("疯狂地跑");
    }
}
class Teacher extends Person{
    @Override
    public void run(){
        System.out.println("优雅地跑");
    }
}

        以上是我们之前实现多态性这个特性的代码,现在我们用抽象来升级,用抽象类更好的支持实现多态这个特性。

        1.1用关键字abstract修饰类、方法

        首先通过用关键字abstract来定义出一个Person父类,由于被abstract修饰,这个父类就只能被继承,不能去new对象,即不能去创建对象,这样就保证只能去new子类的对象了。再用关键字abstract去修饰父类中需要重写的方法。

        1.2注意事项

        还有需要注意的是,这个重写的方法在父类是不可以有方法体的,这个方法确保在子类中把这些方法全部重写,不然没重写或者没有重写完方法的类重新定义为抽象类,不然会报错。有抽象的方法的类必须是抽象类,抽象类里面不一定有抽象方法。抽象类的成员既有成员变量、成员方法、构造器等。(这个会跟接口是有一定的区别)

如下代码加上了抽象类进行升级了:

public class Abstract {
    public static void main(String[] args) {
        Person person1 = new Student();
        person1.run();

        Person person2 = new Teacher();
        person2.run();
    }
}
abstract class Person{
    public abstract void run();
}
class Student extends Person{
    @Override
    public void run() {
        System.out.println("疯狂地跑");
    }
}
class Teacher extends Person{
    @Override
    public void run() {
        System.out.println("优雅地跑");
    }
}

        以上代码会比第一个代码就加上了抽象类、抽象方法,这样写得更加专业。 

        小结:

        抽象类通过定义抽象方法和非抽象方法来实现多态性。抽象方法是没有具体实现的方法,需要在子类中被重写实现。子类可以根据自己的特定需求来实现这些抽象方法,从而实现不同的行为。非抽象方法则有具体的实现,子类可以选择是否重写。

二.接口

        2.1如何定义接口

        我们可以理解为接口是一种特殊的抽象类,它只能包含抽象方法和常量,不能包含非抽象方法。通过关键字interface去定义接口,接口的内容只能是常量,还有抽象方法,所以这个接口是不能去创建对象的,接口是被类通过implements关键字实现的,实现接口的类是实现类。一个类可以去实现多个接口,这个类必须得写完父类的抽象方法,否则实现类必须定义为抽象类。

public class Interface {
    public static void main(String[] args){
        System.out.println(E.NAME);
        E e= new F();
        e.fun();
    }
}

interface E{
    String NAME = "lisi";
    void fun();
}
class F implements E{
    @Override
    public void fun(){
        System.out.println("重写fun");
    }
}

接口中的变量的修饰是默认加上了 public static final 将其修饰成常量,而对于方法会默认在前面加上修饰 public abstract 将其修饰为抽象类。

        2.2接口的好处(重点)

        第一个好处,弥补了类单继承的的不足,一个类可以同时有多个接口。

public class Interface {
    public static void main(String[] args) {
        System.out.println(E.name);
        E e= new F();
        e.fun();

        M m = new F();
        m.m();
    }
}
interface E{
    String name = "lisi";
    void fun();
}
class F implements E,M{
    @Override
    public void fun() {
        System.out.println("重写fun抽象方法");
    }

    @Override
    public void m() {
        System.out.println("重写m抽象方法");
    }
}
interface M{
    void m();
}

        第二个好处,让程序可以面向接口编程,这样程序员就可以方便地切换各种业务实现。

接下来,我再讲讲我自己对接口的想法,接口其实就是一个证,类比作一个人,比如说是驾驶证,学生证,电工证,程序员证书等等,只要这些接口(证)被类(人)去实现,那么这个类(人)就会证明了会干什么,这个类(人)有什么技能,只要看这些接口(证),就可以断定这个类(人)会什么了,有什么技能。

三.比较抽象类与接口

        我们可以这样认为,接口是一个特殊的抽象类,抽象类是一个特殊的类。

        抽象类和接口的区别主要有以下几点:

  1. 抽象类可以包含非抽象方法,而接口只能包含抽象方法和常量。
  2. 一个类只能继承一个抽象类,但可以实现多个接口。
  3. 抽象类的目的是为了代码复用和规范化,而接口的目的是为了实现多态性。
  4. 抽象类可以有构造方法,而接口不能有构造方法。
  5. 抽象类的方法可以有访问修饰符,而接口的方法默认为public

        在使用时,应根据具体的需求选择使用抽象类还是接口。如果需要定义一组行为且不关心具体实现,可以使用接口。如果需要定义一些通用的方法和属性,并且要求子类必须实现某些方法,可以使用抽象类。



你可能感兴趣的:(java,开发语言)