Java宝典-抽象类和接口


铁汁们好,今天我们学习抽象类和接口~

1. 抽象类

1.1 抽象类的概念

什么是抽象类?在面向对象中,如果一个类中的信息并不能完整地描述一个对象,这样的类就是抽象类,拿我们之前的例子:
在这里插入图片描述

Dog类和Cat类继承了Animal类,Animal中有eat方法,但是猫除了吃,还能抓老鼠,如果在Animal中加上抓老鼠的方法,那么狗继承了Animal,也就是说狗也能抓老鼠,这显然有点不现实,所以Animal并不能完整的描述一个对象,此时我们可以把它设计成抽象类,那么如何设计?

1.2 抽象类的语法

当一个类被abstract关键字修饰时,这个类就是抽象类

abstract class Animal{
	//...
}

注意事项:
1.抽象类中可以包含普通的方法和属性,也可以包含构造方法
2.如果一个方法被abstract修饰,表示该方法是抽象方法,抽象方法不能有具体的实现,如

abstract class Animal{
	public abstract void func();
}

1.3 抽象类的特点

抽象类有以下特点:

  1. 抽象类不能实例化:不能通过new来进行实例化
Animal animal = new Animal();
//错误的,抽象类不能实例化
  1. 抽象类中的抽象方法不能是private修饰的

  2. 抽象类中的抽象方法不能有具体实现,是因为抽象类的作用主要是被继承,子类需要重写抽象类中的抽象方法

abstract class Animal{
	public abstract void func(){}//错误的,花括号就表示这个方法有具体实现
}
  1. 抽象方法不能是final和static修饰的(因为要被子类重写)
  2. 抽象类中可以没有抽象方法,但是抽象方法一定是在抽象类当中才能出现

2. 接口

2.1 接口的概念

接口是啥?在java中,可以认为是很多个类的公共规范,接口是一种引用数据类型.比如USB接口,安卓充电器接口,这些接口都是统一大小的,只要符合规范,大家都能使用它.

2.2 接口的语法

在java中,接口的定义和类的定义格式比较类似,将class替换成interface关键字即可

public interface 接口名{
//....
}

2.3 接口的特点

  1. 接口也不能实例化
  2. 接口中的方法都是抽象方法,是被public abstract修饰的,不能被其他修饰符修饰
  3. 接口中的方法不能有具体实现,只有加了default或者static的方法才能实现
    例如:
interface IA {
    static void fun1() {
        System.out.println("static");
    }
    default void fun2() {
        System.out.println("default");
    }
}
  1. 接口中的成员变量默认是public static final修饰的,所以必须赋初始值
  2. 接口中的方法和变量一般不加修饰符,这样代码更加美观,清晰
interface IA {
    int A = 10;
    void func();
}
  1. 接口中不能出现静态代码块/构造方法/实例代码块
  2. 重写接口中的方法时,重写的方法只能是public的
  3. 当一个类需要实现某个接口时,使用implements关键字,而且这个类必须重写接口的方法
interface IA {
    int A = 10;
    void func();
}
class A implements IA{
    @Override
    public void func() {
        
    }
}

2.4 实现多个接口

java中不能有多继承(一个类继承多个类),但是一个类可以实现多个接口,接口很好的解决了java不能多继承这个问题

interface IA {
    //...
}

interface IB {
    //...
}

class A implements IA, IB {
    //...
}

2.5 接口的继承

接口之间也可以继承,接口之间的继承同样使用extends

interface IA {
    //...
}

interface IB extends IA {
    //...
}

3. 接口使用案例

父类Animal(抽象类)

public abstract class Animal {
    protected String name;
    protected int age;
    public Animal(String name, int age) {
        this.age = age;
        this.name = name;
    }
}

IFly接口

public interface IFly {
    void Flying();
}

IRunning接口

public interface IRunning {
    void Running();
}

子类(实现了IFly, IRunning接口,并且重写了接口中的方法)

public class Duck extends Animal implements IFly, IRunning {
    public Duck(String name, int age) {
        super(name, age);
    }
    @Override
    public void Flying() {
        System.out.println(this.name + "正在飞");
    }
    @Override
    public void Running() {
        System.out.println(this.name + "正在跑");
    }
}
  • 31
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值