java学习(4)抽象方法、抽象类+接口

1、抽象方法:

可以进行描述但无法直接写出,类似下图:在这里插入图片描述

(1)抽象类的定义及使用:

(1)抽象方法所在的类必须是抽象类,但抽象类中可以没有抽象方法 。
(2)不能直接创建new抽象类对象
(3)必须用子类来继承抽象父类,且子类必须覆盖重写抽象父类的 所 有 \color{red}所有 抽象方法 ,缺少一个都会报错。

在这里插入图片描述


注意:
如果子类有部分没有覆盖重写父类的抽象方法,那么该类必须也是抽象类,由于抽象类本身无法直接使用,所有还需要定义一个子类实现它,就造成了爷孙的调用形式。
在这里插入图片描述

2、接口:Interface

接口是多个类的公共规范,接口是一种引用数据类型,最重要的内容就是抽象方法。

接口的定义格式:

public interface 接口名称{
	//	接口内容
}

创建接口文件的方法:
在这里插入图片描述
弹出下框:
在这里插入图片描述


我们知道定义一个类后每个类class都会生成一个.class文件,但是换成了关键字interface之后,编译生成的字节码文件仍然是: .java --> .class

如果是Java 7,那么接口中可以包含:

  • 1.常量
  • 2.抽象方法

如果是Java 8,还可以额外包含:

  • 3.默认方法
  • 4.静态方法

如果是Java 9,还可以额外包含:

  • 5.私有方法

(1)抽象方法定义+使用

定义:

public abstract 返回值类型 方法名(参数列表);

其中的public abstract要么全不写,要么省略一部分,绝对不能改动,改动就错了。也就是说下面的写法都对。

public interface interface1 {
    public abstract void method1();
    public void method2();
    abstract void method3();
    void method4();
}

接口的使用:
(1)接口不能直接使用,也需要一个“实现类”来实现。
(2)接口的实现类必须覆盖重写接口的所有抽象方法

实现类的格式如下:

public class 实现类名称 implements 接口名称{
}

首先创建一个class类,建议把类的名称改为接口名+impl(表示是从那个接口implement过来的),Alt+回车可以自动加载abstract类
在这里插入图片描述
完整图如下:
在这里插入图片描述
注意:
如果“实现类”有部分没有覆盖重写接口的抽象方法,那么该类必须也得是抽象类,但由于抽象类本身无法直接使用,所有还需要定义一个子类实现它,就造成了爷孙的调用形式。

(2)默认方法定义+使用

定义:

public default 返回值类型 方法名(参数列表){
//方法体
}

默认方法可以解决接口升级的问题

什么是接口升级?当有一个接口,且其中只有一个抽象类。如果有多个实现类来实现接口的抽象类时必须对所有的抽象类进行重写。(具体问题见下图)
在这里插入图片描述可是当接口中重新定义一个新的抽象类时,是不是需要对所有的抽象类进行修改?此时只要将新添加方法改成默认方法就能解决这个问题。


使用:

  • public可以省略但是不能改成其他的关键字
  • 接口中的默认方法会被实现类自动继承下去
  • 可以在实现类中对默认方法进行方法重写

在这里插入图片描述
实现类中并没有对接口的默认方法覆盖重写,但是调用接口的默认方法
在这里插入图片描述
也可以在实现类中对默认方法进行方法重写:
在这里插入图片描述

(3)静态方法定义+使用

从java8开始在接口中允许定义静态方法
定义:

public static 返回值类型 方法名(参数列表){
//方法体
}

使用:
不能通过实现类的对象来对接口的静态方法进行调用;而应该用接口名称直接调用静态方法。
在这里插入图片描述
之前的静态方法都和类有关,可以不定义对象而通过类直接调用;这里接口中的静态方法同理,可以不定义实现类对象而通过接口名称直接使用。

(4)私有方法定义+使用

当接口中的多个默认/静态方法出现重复的部分,如下:
在这里插入图片描述

我们需要将重复部分抽取出来,但是这个公有方法不能被实现类使用,否则会导致在实现类中默认继承commen方法,我们应该让她私有化

从java9开始在接口中允许定义私有方法
定义:

  • 普通私有方法:解决多个默认方法之间的重复代码问题
private 返回值类型 方法名(参数列表){
//方法体
}
  • 静态私有方法:解决多个静态方法之间的重复代码问题
private static 返回值类型 方法名(参数列表){
//方法体
}

使用:
普通私有方法:
在这里插入图片描述
静态私有方法:
在这里插入图片描述

(5)接口常量定义及使用

定义:

  • 接口常量,一旦赋值不可修改(final修饰的变量不可修改),所以接口中的常量不能不赋值(使用默认值就不能进行修改了)
  • public static final可以写一部分或者都不写。
  • 常量名称全部大写,下划线进行分割。
public static final 数据类型 常量名称 = 数据值

使用:
在这里插入图片描述

(6)接口之间的多继承关系

1.类与类之间是单继承的,直接父类只有一个;类与接口之间是多实现的,—个类可以实现多个接口。多个父接口当中的抽象方法可以重复。
在这里插入图片描述
2.接口与接口之间是多继承的;多个父接口当中的默认方法如果重复,那么子接口必须进行默认方法的覆盖重写,而且带着default关键字。
在这里插入图片描述

3、接口使用的注意事项

1.接口是没有静态代码块或者构造方法的。

2.一个类的直接父类是唯一的,但是一个类可以同时实现多个接口。格式:

public class MyInterfaceImpl implements MyInterfaceA,MyInterfaceB {[/覆盖重写所有抽象方法
}

3.如果实现类所实现的多个接口(如:MyInterfaceA,MyInterfaceB )当中,存在重复的抽象方法,那么只需要覆盖重写一次即可

4.如果实现类没有覆盖重写所有接口当中的所有抽象方法,那么实现类就必须是一个抽象类

5.如果实现类所实现的多个接口当中,存在重复的默认方法,那么实现类一定要对冲突的默认方法进行覆盖重写

6.如果一个类继承的父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法

具体操作请点击参考视频

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值