Java中接口和抽象类的学习总结

对于接口和抽象类,自己也不是很清楚,特别是对于其内部的一些约束,总是记不得,所以在此做一定的记录,供大家学习使用。

在java语言中,abstract class和interface是支持抽象类定义的两种机制。在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的(类具体化),如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

我们直接从代码上来进行解析:

abstract class

abstract class Animal{
    // 表示该动物有多少条腿,注意可以是私有的
    // 当然,这里只是演示用
    private int legs; 

    public abstract void move();
    public void eat(){
        System.out.println("吃东西");
    }
}

class Fish extends Animal{
    // 实现抽象类中的抽象方法,不实现就会报错
    public void move(){
        System.out.println("游泳");
    }
}

class Rabbit extends Animal{
    // 实现抽象类中的抽象方法,不实现就会报错
    public void move(){
        System.out.println("跳");
    }
}

在这里,我们定义抽象类需要遵循以下几条规则:

  • 一个类如果包含抽象方法,那么这个类就必须声明为abstract,而且不能使private的(要不然子类怎么继承啊)
  • 抽象类中可以没有抽象方法
  • 抽象类无法创建实例,只能被继承
  • 非抽象类继承抽象类,就必须实现抽象类中的所有抽象方法
  • 抽象类可以继承抽象类,可以不重写父类的方法

interface

接口和抽象类很类似,接口是抽象方法的集合,用interface来声明。

  • 接口不能用于实例化对象。
  • 接口没有构造方法。
  • 接口中所有方法都必须是抽象的。
  • 接口不能包含成员变量,除了 static 和 final 变量。
  • 接口不是被继承,而是需要被类实现,使用implements。
  • 通过接口,我们可以实现多继承。

代码示例

interface AttackWay{
    // 注意,抽象方法不能有方法体
    void attack();
}

interface MoveWay{
    void move();
} 

class Person implements AttackWay,MoveWay{
    public void attack(){
        System.out.println("使用拳头攻击");
    }
    public void move(){
        System.out.println("使用脚攻击");
    }
}

至于这二者系统的区别,我觉得有一张图很不错,贴在下面:

接口和抽象类的区别

参照了网上的部分博客,发现有一篇总结的很好,在此推荐给大家。
java中接口(interface)和虚基类(abstract class)的区别

猜你喜欢

转载自blog.csdn.net/RabitMountain/article/details/78320027