Java 中的接口定义和继承规则详解

目录

1、接口的定义

(1)接口中的默认方法

(2)接口中的静态方法

2、Java 中的继承

(1)继承对方法覆盖和隐藏

(2)final 方法和 final 类

(3)抽象类和抽象方法


1、接口的定义

        在 Java 中,接口是一种引用类型,类似于 class,在接口中只能包含常量、方法签名(没有方法体)、默认方法(有方法体)、静态方法(有方法体)和嵌套类。方法体只存在于默认方法和静态方法中。且接口不能被实例化,它们只能由类去实现或者由其他接口去继承。按照惯例,implements 语句跟在 extends 语句后面。// 先写 extends,后写 implements

        接口中的所有抽象方法、默认方法和静态方法都是隐式的 public 方法,因此可以省略 public 修饰符。此外,接口也可以包含常量声明。在接口中定义的所有常量值都是隐式的 public、static 和 final。同样,你可以省略这些修饰符

        下边是一个接口的定义示例:

import java.time.*;

public interface TimeClient {
    // 方法签名
    void setTime(int hour, int minute, int second);
    void setDate(int day, int month, int year);
    void setDateAndTime(int day, int month, int year,
                               int hour, int minute, int second);
    LocalDateTime getLocalDateTime();
    
    // 静态方法
    static ZoneId getZoneId (String zoneString) { 
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }
    // 默认方法
    default ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }
}

(1)接口中的默认方法

        当你扩展一个包含默认方法的接口时,你可以执行以下操作:

  • 完全不提及默认方法,这将使你的扩展接口继承默认方法。
  • 重新声明默认方法,使其变为抽象方法。
  • 重新定义默认方法,并使用新的默认方法覆盖它。

        1)采用完全不提及默认方法的方式,扩展接口 TimeClient,如下所示:

public interface AnotherTimeClient extends TimeClient { }

        那么实现 AnotherTimeClient 接口的任何类都将具有由默认方法 TimeClient.getZonedDateTime() 指定的实现逻辑。

        2)采用重新声明默认方法的方式,扩展接口 TimeClient,如下所示:

public interface AbstractZoneTimeClient extends TimeClient {
    public ZonedDateTime getZonedDateTime(String zoneString);
}

        那么任何实现 AbstractZoneTimeClient 接口的类都必须实现 getZonedDateTime() 方法;该方法是一个抽象方法,就像接口中所有其他非默认(和非静态)方法一样。

        3)采用重新定义默认方法的方式,拓展接口 TimeClient,如下所示:

public interface HandleInvalidTimeZoneClient extends TimeClient {
    default public ZonedDateTime getZonedDateTime(String zoneString) {
        try {
            return ZonedDateTime.of(getLocalDateTime(),ZoneId.of(zoneString)); 
        } catch (DateTimeException e) {
            System.err.println(
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

swadian2008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值