• 首页
  • Java
  • java 中的 抽象方法 抽象类 和 接口有啥瓜葛

java 中的 抽象方法 抽象类 和 接口有啥瓜葛


文章目录



什么是java中的抽象方法

抽象方法是一种特殊的方法:
它只有声明,而没有具体的实现

例如:

abstract void eat();

上面定义了一个方法 eat() ,有修饰关键词 abstract ,而且只有方法签名,没有方法的具体实现,
这就是一个java中的 抽象方法.
我们可以看到关键词 abstract 前面再没有任何修饰关键词 [ public , protected 或者 private ]
为什么不能有修饰关键词,我们留到下面再讲.


什么是java中的抽象类

一个类含有抽象方法,则称这个类为抽象类
抽象类必须由关键词 abstract 修饰;
我们来看一个抽象类的示例:

abstract class Person {
    abstract void eat();
}

包含抽象方法 eat() ,并且类前面有关键词 abstract 修饰,所以上面的类就是一个抽象类.
这里可能有疑问,抽象类必须要包含抽象方法吗?如果没有抽象方法呢?

abstract class Person {
}

这也是一个抽象方法,但是这种空的抽象类有什么意义呢?
因为抽象方法只是一个方法签名,没有具体方法实现,所以这种抽象类必须由子类继承才有存在的意义,不能直接创建类的实例;
因为继承,其中的抽象方法会被子类重写;
所以没有实现继承的抽象类是没有意义的,没有定义任何抽象方法的抽象类更没有意义.

因为抽象类必须要实现继承,所以类前面缺省的访问修饰符默认 public 不能是 private ,可以不写直接省略(缺省 public)


什么是java 中的接口

接口是一种特殊的抽象类;
接口中没有变量,只有public static final修饰的静态常量,三个修饰符可以省略;
接口中所有的方法都是抽象方法,且默认就是public权限;

java中使用 interface 来声明接口:

interface Person {
    void eat();
    String getName();
}

接口中的方法全部只有定义而没有被实现;
所有方法默认都是 public abstract 的.

一个类使用 implements 关键词来实现接口

class Child implements Person {
    private String name;

    public Child(String name) {
        this.name = name;
    }

    @Override
    public void eat() {
        System.out.println(this.name + " 用勺子吃饭");
    }

    @Override
    public String getName() {
        return this.name;
    }
}

类和接口的继承

Java类的继承是单一继承,一个类只能继承一个父类;
Java类却可以实现多个接口;


为什么不能继承多个父类?

假如多个父类同时存在签名相同的方法,那多继承后,子类到底该实现哪一个父类的同名方法呢?


为什么可以实现多个接口?

接口中全都是抽象方法,只有签名没有方法实现,所以就算有同名的抽象方法,子类重写该方法,实现自己的方法内容即可,完全不受影响.

出自:java 中的 抽象方法 抽象类 和 接口有啥瓜葛

回到顶部