My Blog

Java面向对象五

学习笔记,仅供参考

参考B站Mirco_Frank - java与生活 | 知乎参考文章

本文重点:抽象类 | 接口


在上一节,小伙用继承的方法将原来的小区养狗程序扩展为社区宠物管理程序。狗、猫、仓鼠等动物都继承于 Animal 类,以此减少了程序的繁琐的重复,也使得程序更加贴近现实。然而,Animal 类仅仅是为了让子类继承而存在,没有实际作用。所以,为了不再去使用 Animal 类,即让其不能再实例对象,就有了抽象类的概念。


抽象类与抽象方法

抽象与具体 这是一对哲学范畴,在日常生活中就存在许多的例子,如:人类是抽象的,张三、李四是具体的;颜色是抽象的,红色、蓝色是具体的;动物是抽象的,狗、猫、仓鼠是具体的。上一节中,从具体的狗、猫等动物中找出了它们的共性,而将这些共性放在一起就构成了动物。所以,是从一个个具体的事物开始分析总结,进而概括,这样这些事物的抽象概念就产生了。因此,就可以认为抽象是对具体的概括(解释)。在面向对象编程中,像 Animal 这样的类就成为抽象类,现实之中找不到与之对应的具体事物。

在 Java 中用 abstract 来修饰,被其修饰的抽象类不能用 new 来创建实例对象,public abstract class Animal() {...} ;被其修饰的抽象方法没有实际意义,抽象方法只能存在于抽象类之中,且该方法只有方法名没有大括号和内容,如:public abstract void barking();

:抽象类的子类都 必须 要重写父类中的 所有 抽象方法,而且重写的方法中也不能用 super 来调用父类的方法。

public abstract class Animal() {
    // 抽象类中的抽象方法
    public abstract void barking();
}

/*************分割线****************/

public class Dogs extends Animal() {
    // 重写抽象父类的抽象方法
    @Override
    public void barking() {
        System.out.println("汪汪汪!");
    }
}

/****************分割线********************/

public class Cats extends Animal() {
    @Override
    public void barking() {
        System.out.println("喵喵喵!");
    }
}

接口(Interface)

在软件工程中,接口泛指提供别人调用的方法或函数,在 Java 中,它表示对动作行为的抽象。接口定义的形式如下:

public interface 接口名 {
    // 定义常量
    public static final 数据类型 常量名 =;

    // 定义抽象方法, 不需内容
    public abstract 返回值类型 方法名(数据类型 参数名...);
}

注:接口中的变量会默认为 public static final 变量,且只能是此类型,方法会默认为 public abstract 类型,也只能是此类型。所以,接口中的变量都是常量(全大写表示),方法都是抽象方法,即其子类要重写这些方法。

另外,接口是可以继承接口,如: public interface ManInterface extends HumanInterface {...}

类实现(继承)接口:用 implements 修饰

public class ClassName implements InterfaceName {
    // ...
    } 

类要实现接口,即类要重写接口中的方法,因为它们都是抽象的,无意义的。


抽象类与接口的区别

抽象类是对 具体事物 进行抽象;接口是对 动作、行为 进行抽象。

  • 相同点

    1. 两者都不能通过 new 来实例对象

    2. 抽象类的子类和接口的实现类都要重写其父类的方法

  • 不同点

    1. 抽象类可以有常规的方法,而接口都是抽象方法

    2. 抽象类可以有各种类型的变量,而接口都是常量

    3. 抽象类可以有静态变量和静态方法,而接口没有

    4. 一个类只能继承一个抽象类,而一个类可以实现多个接口

区别