首页 > 其他分享 >JTCR-包和接口-07

JTCR-包和接口-07

时间:2024-04-18 15:13:01浏览次数:16  
标签:JTCR 07 实现 默认 接口 方法 public 定义

包用于划分类的命名空间,使得不同包中的同名类不会冲突。
Java 使用文件夹存储包,文件夹名和包名一致。
Java 运行时系统从当前目录中、CLASSPATH 变量定义的值、-classpath 指定的值这三种途径寻找包。

包和成员访问

可访问性 private 无修饰符 protected public
同一个类
同一个包的子类
同一个包的非子类
不同包的子类
不同包的非子类

一个源文件中只能有一个 public 类,并且该文件必须以这个类的名称命名。

导入包

import 语句位于 package 语句之后,其他语句之前。
java.lang 包由编译器隐含导入。
如果使用全限定名,则不需要 import 语句。

接口

一个类可以实现任意数量的接口,一个接口可以被任意数量的类实现。

modifier interface name {
  type name(parameterList);
  
  type name = value;
}

没有修饰符时,接口只能被同一个包下的其他对象使用。public 接口在一个源文件中只能有一个,并且这个文件的名字必须和这个接口同名。接口中的方法本质上都是抽象方法。每个实现接口的类必须实现这个接口的全部方法。

从 JDK8 开始,接口中的方法允许有默认实现,也有了静态方法。从 JDK9 开始,接口中可以有私有方法。

接口中可以定义变量,这些变量默认是 final 和 static 的,必须初始化,不能被实现类改变。

接口中所有方法和变量默认为 public。

class name implements interface[,interface...] {
  // body
}

若某个类实现了两个接口,同时这两个接口定义了完全一样的方法,则类实现这个方法,表示同时实现了这两个接口定义的该方法。

实现接口的方法时,方法必须定义为 public 并且方法签名必须和接口中的定义一致。

接口类型变量可以引用任何实现了该接口的类实例,这个变量调用方法时,调用的是类实例中对应的方法。能够通过该变量调用的方法必须在接口中有定义,不能调用接口中没有定义的方法。

实现接口的类没有实现接口中全部方法时,该类必须定义为抽象类,该类的子类必须实现接口的全部方法或者定义为抽象类。

接口作为一个类或者另一个接口的成员时,该接口分别称为成员接口、nested 接口。nested 接口可以用 public、private 或 protected 修饰。在定义 nested 接口的作用域外使用该接口时,使用完全限定名,如 ClassName.interfaceName

实现仅定义了变量的接口的类,具有该接口定义的所有变量,这些变量本质上是常量。(不推荐这种做法。)

接口也可以像类一样,进行继承。实现了某个接口的类必须实现该接口的所有方法,如果该接口还继承了其他接口,那么所有继承自其他接口的方法也必须被实现。

默认接口方法

从 JDK8 开始,接口中允许定义默认方法,默认方法是接口提供了实现的方法,也称 extension method。
默认方法提出的主要动机是,当使用广泛的接口突然加入新的方法,由于之前使用该接口的代码没有实现这个新方法,涉及到这个接口的旧代码都会出错。如果使用了默认方法,则旧代码不会受到影响。
默认方法的另一个动机是,有时接口的部分方法某些实现类不需要,此时只能将该方法实现为空方法,冗余。默认方法解决了这个问题。

接口和类的很大不同之处在于,接口不能维护状态信息。接口不能实例化。

default type name(parameterList) {
  // body
}

实现接口的类可以实现,也可以不实现接口的默认方法。

当一个类实现了两个接口,这两个接口具有相同的默认方法时,1)如果该类重写了这个默认方法,则之后使用的是类重写的方法;2)如果没有重写这个默认方法,则报错。

当一个类实现了一个接口 A,A 继承了接口 B。这两个接口具有相同的默认方法时,类没有重写该默认方法,则使用的是接口 A 定义的默认方法。访问另一个默认方法的形式为:interfaceName.super.methodName()

interface IA {
  default void m() {
    System.out.println("a");
  }
}

interface IB extends IA {
  default void m() {
    // 调用 IA 的默认方法
    // 只能调用直接父接口的方法
    IA.super.m();
    System.out.println("b");
  }
}

public class InterfaceTest implements IB {

  public static void main(String[] args) {
    // 不允许使用 IA.super.m()
    // 可以使用 IB.super.m()
    new InterfaceTest().m();
  }
}

接口中使用静态方法

JDK8 开始,接口允许定义静态方法。静态方法的使用与在类中定义时相似,都不需要实例化即可调用。interface.staticMethod()
静态方法不能被继承,无论是子接口还是实现了该接口的类。

私有接口方法

JDK9 开始,接口允许定义私有方法。私有方法不能被继承,包括子接口。私有方法只能被同一个接口的默认方法和私有方法使用。

提供私有方法的目的是给其他方法提供通用的代码段,避免代码冗余。

参考

[1] Herbert Schildt, Java The Complete Reference 11th, 2019.
[2] 接口相关

标签:JTCR,07,实现,默认,接口,方法,public,定义
From: https://www.cnblogs.com/xdreamc/p/16361141.html

相关文章

  • JTCR-深入了解方法和类-05
    方法重载一个类中存在多个同名方法,这些方法的形参类型或数量不同的现象称为方法重载。同名方法的返回值类型在判断是否构成重载时不予考虑。方法重载是支持多态的方式之一。当调用同名方法时,Java根据传入方法的实参类型、数量和顺序确定某个唯一精确匹配的方法,然后调用该方法;如......
  • JTCR-继承-06
    继承基础classA{inti;voidm(){//body}}classBextendsA{intk;voidn(){//body}}没有类可以成为其自身的超类(superclass)。子类不能访问超类中的private成员。超类类型变量可以引用派生自该超类的子类对象,但是使用该变量只......
  • JTCR-介绍类-04
    类基础类表示一个新的数据类型。简单类的一般形式:classClassName{typeinstanceVariable;//...typemethod(parameterList){//方法体}//...}有些Java应用不需要main方法。定义对象new操作符在运行时动态地给一个对象分配内存并返回指向该......
  • JTCR-数据类型、变量和数组-01
    原始类型Java是强类型语言,在编译时会检查所有变量、表达式的类型是否兼容。Java为数据定义了8种原始类型(primitivetype),分为4组:整型:byte、short、int、long,表示整数。浮点数:float、double,表示小数。字符:char,表示字符集中的元素。Boolean:boolean,表示true/false值。......
  • JTCR-运算符-02
    算术运算符算术操作符不能对boolean类型使用,可以对char类型使用,因为char类型是int类型的子集。除操作符对整数使用,结果为整数。取模运算符对整数和浮点数使用,都返回余数。在某些情况下,复合赋值操作符比它的等价形式更有效率。位运算符运算符运算结果~按位......
  • Go 单元测试之mock接口测试
    目录一、gomock工具介绍二、安装三、使用3.1指定三个参数3.2使用命令为接口生成mock实现3.3使用make命令封装处理mock四、接口单元测试步骤三、小黄书Service层单元测试四、flags五、打桩(stub)参数六、总结6.1测试用例定义6.2设计测试用例6.3执行测试用例代码6.4运行测......
  • 自动生成接口文档coreapi
    drf-yasg只能用于drf去看官方文档2coreapipipinstallcoreapi2.1配置路由fromrest_framework.documentationimportinclude_docs_urlsurlpatterns=[...path('docs/',include_docs_urls(title='站点页面标题'))]2.2drf配置#AttributeError:'......
  • drf序列化用APIView写编写5个接口并校验数据
    步骤:写一个类,继承Serialier在类中写字段,字段就是要序列化的字段在视图函数中,序列化类,实例化得到对象,传入该传的参数调用序列化类对象的serializer.data方法完成序列化【一】写序列化类serializer.pyfromrest_frameworkimportserializersfromrest_framework.e......
  • 接口自动化测试工程实践分享
    本文作者:欧海锋,碧桂园服务高级测试工程师,致力于研究测试技术。一、前言接口自动化测试是一种软件测试技术,它通过模拟用户系统操作来对系统的接口进行自动化测试。接口自动化测试的目的是为了提高测试效率和准确性,同时降低测试成本和周期。以下是为什么需要进行接口自动化测试的......
  • 07_QT时间编程之QT时钟
    QT时间编程之QT时钟这节课我们做一个计时器​ qtime:qt的时间类​ qtimer:qt的定时类代码widget.h#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QTime>#include<QTimer>namespaceUi{classWidget;}classWidget:publicQWidget{Q_OBJE......