Java -抽象与接口

十七、抽象

概述


在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类

没有方法体:public void eat(){}

里面是空的,所以是没有方法体。


特点

  • 抽象类和抽象方法必须使用abstract关键字进行修饰

    public abstract class 类名{}

    public abstract void eat();

  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

  • 抽象类不能实例化

    例如animal是一个抽象类,则animal a = new animal()就不能使用

  • 抽象类的子类

    要么重写抽象类的所有抽象方法

    要么是抽象类

  • 成员变量可以是变量也可以是常量

  • 有构造方法但不能被实例化,用于子类访问父类数据的初始化

  • 成员方法

    可以有抽象方法,限定子类必须完成某些操作

    也可以有非抽象方法,提高代码复用性

继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,没有意义。

十八、接口

1 概述


接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用

Java中的接口更多体现在对行为的抽象


2 接口特点

  • 接口用关键字interface修饰

    public interface 接口名{}

  • 类实现接口用implements表示

    public class 类名 implements 接口名 {}

  • 接口不能直接实例化,参照多态的方式实例化,叫做接口多态

例如接口为jump,有个对象implements了jump

在测试类中定义为 jump h = new horse();


3 接口的成员特点

  • 成员变量

只能是常量

默认修饰符: public static final

所以说

int num3 = 10;
public static final int num3 = 10;
//以上两句话意义相同

  • 构造方法

接口没有构造方法,因为接口是对行为进行具体抽象的,没有具体存在

类Object是类层次结构的根。每个类都有Object作为超类。

没有继承的类默认继承Object,有说明继承什么对象则间接继承Object。

public class InterImpl implements Inter{}
//等价于
public class InterImpl extends Object implements Inter{}

  • 成员方法

只能是抽象方法

默认修饰符: public abstract

public abstract int num = 3;
//等价于
int num = 3;

4 类和接口的关系

  • 类和类的关系

​ 继承关系,只能单继承,但是可以多层继承

  • 类与接口的关系

​ 实现关系,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口

public class InterImpl extends Object implements Inter1,Inter2,Inter3{
}
  • 接口与接口的关系

​ 继承关系,可以单继承,也可以多继承


5 抽象类和接口的区别

抽象类是对事物的抽象,而接口是对行为的抽象

  • 成员区别

    抽象类 变量,常量;有构造方法;有抽象方法,也有非抽象方法

    接口 常量;抽象方法

  • 关系去写

    类与类 继承,单继承

    类与接口 实现,可以单实现,也可以多实现

    接口与接口 继承,单继承,多继承

  • 设计理念区别

    抽象类 对类抽象,包括属性、行为

    接口 对行为抽象,主要是行为

Alarm.java
public interface Alarm{
    void alarm();
}

Door.java
public class Door{
    public void open(){...};
    public void close(){...};
}

DoorDemo.java
public class DoorDemo extends Door implements Alarm{
    public void alarm(){...};
}



6 接口名作为形参和返回值

方法的形参是接口名,其实需要的是该接口的实现类对象

方法的返回值是接口名,其实返回的是该接口的实现类对象


7 接口中的默认方法

当接口想要增加新的方法,但为了避免麻烦使得所有实现该接口的类都需要重写该方法

所以引入了默认方法

定义格式:

public default 返回值类型 方法名(参数){}
//范例
public default void show3(){ }

如以上例子中show3方法可以不用被重写

默认方法不是抽象方法,所以不强制被重写,但是可以被重写,重写的时候去掉default关键字

public可以省略,default不能省略

8 接口中的静态方法

为了防止一个类实现的多个接口中存在相似名的方法,引入了接口静态方法

定义格式:

public static 返回值类型 方法名(参数){}
//范例
public static void show()

如果是接口存在静态方法,则在main里直接调用即可

inter1.java
public interface inter1{
    public static void show(){
        System.out.println("show");
    }
}
Demo.java
public class Demo{
    public static void main(String[] args) {
    	inter1.show();   
    }
}

注意事项

静态方法只能通过接口名调用,不能通过实现类名或者对象名调用

public可以省略,static不能省略


9 接口中的私有方法

当接口里的方法体中存在共同内容,为了避免重复的冗余代码出现,可以把这段重复性高的代码单独写成private方法出来。

接口中私有方法定义格式

private 返回值类型 方法名(参数){}

或者是带静态的

private static 返回值类型 方法名(参数){}

注意事项

默认方法可以调用静态和非静态的私有方法

静态方法只能调用私有静态方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值