Kotlin可见性修饰符详解

作者:让开,我要吃人了 时间:2023-02-28 22:36:18 

一、 四种修饰符的说明

  • public修饰符表示 公有 。此修饰符的范围最大。当不声明任何修饰符时,系统会默认使用此修饰符。

  • internal修饰符表示 模块 。对于模块的范围在下面会说明。

  • protected修饰符表示 私有+子类。值得注意的是,此修饰符不能用于顶层声明,在下面可以看到。

  • private修饰符表示 私有 。此修饰符的范围最小,即可见性范围最低。

二、在不同场景下各个修饰符声明的范围讲解

对于可见性修饰符来说,不管是Java还是Kotlin,在不同的场景下用可见性修饰符修饰过的变量、函数、属性等都有不同的引用范围。

2.1、在包(package)中声明,即顶层声明的情况

在顶层申明中分为下面两种情况:

  1. 在同一个文件中访问的情况

  2. 在不同文件中访问的情况

2.1.1、测试同一个文件中声明不同的修饰符的范围

Kotlin可见性修饰符详解

在同一个文件中的访问情况

2.1.2、测试不同文件中声明不同的修饰符的范围

Kotlin可见性修饰符详解

在不同文件中的访问情况

2.1.3、小结

  • 在顶层情况下声明的变量、方法、类、接口等,不能使用protected修饰符。

  • public修饰符可省略,因为它是系统默认的。

  • 在同一文件下,用任意修饰符都可以访问,当然此处除开protected修饰符

  • 在不同文件下,只能访问public、internal修饰符修饰的变量、方法等

  • 上边只演示了在顶层声明方法的情况,不过声明其他的也是一样的。

2.2、在类(class)和接口(interface)中声明的情况

在类中声明的情况和在接口中声明的情况是完全不相同的。

2.2.1、测试在类中声明的情况

Kotlin可见性修饰符详解

在类中声明的情况

2.2.2、测试在接口中声明的情况

在接口中声明的情况

Kotlin可见性修饰符详解

使用接口中声明的属性

Kotlin可见性修饰符详解

2.2.3、小结

  • 在类中声明属性、方法等,可以使用任意修饰符修饰。并且在类中的任意位置都能访问各个修饰符修饰的属性、方法等。

  • 在类外,只能访问由public、internal修饰符修饰的属性、方法。此情况不管是不是在同一个文件中去操作。

  • 在接口中声明的情况下,只能由public修饰符修饰属性。方法可由public、private两个修饰符去修饰,但是,用private修饰符修饰符修饰的方法不能被实现该接口的类重写。

  • 为了使用接口中由public修饰符修饰的属性、方法等。只能定义一个类去实现该接口,然后重写其属性、方法。这样就能在可在类中或类外去操作。

2.3、在构造函数中声明的情况

Kotlin可见性修饰符详解

在Kotlin中分为主构造函数,和副级或多级构造函数,当然在Java中也是存在的,只不过我们更习惯称其为方法重载。)。
故而,当我们在构造函数中声明的情况下,如果是主构造函数的时候,是和在类(class)中声明的情况是一样的。如果是主构造函数的时候,则是和在局部声明的情况是一样的。

2.4、局部声明的情况

在局部声明的情况下,只能使用public修饰符修饰的变量。并且在变量只能在局部这个范围内使用,出了这个范围后就访问不到了。

Kotlin可见性修饰符详解

三、与Java中的可见性修饰符的对比

Java中的可见性修饰符和Koltin中的可见性修饰符还是很有几点不同之处的:

  1. 四种修饰符的不同。Koltin的四种修饰符(public、interna、protected、private),Java的的四种修饰符(public、protected、privavte、default(即不使用任何修饰符))。

  2. 默认修饰符的不同。Kotlin的默认修饰符为public,Java的默认修饰符为default。

来源:https://blog.csdn.net/weixin_55362248/article/details/121537044

标签:Android,Kotlin,可见性修饰符
0
投稿

猜你喜欢

  • Java Servlet请求重定向的方法

    2022-05-23 16:56:02
  • C# SaveFileDialog与OpenFileDialog用法案例详解

    2023-01-28 05:44:42
  • Android GPS获取当前经纬度坐标

    2021-10-31 12:09:40
  • SpringBoot和Vue.js实现的前后端分离的用户权限管理系统

    2023-09-03 14:37:33
  • c#文件的复制,移动,创建(实例代码)

    2023-05-29 21:49:14
  • Flutter利用注解生成可自定义的路由的实现

    2022-08-28 15:12:16
  • c++虚函数与虚函数表原理

    2023-12-09 07:22:45
  • SpringBoot 整合mybatis+mybatis-plus的详细步骤

    2022-09-29 21:06:10
  • java中sdk与jdk的区别详细解析

    2023-11-25 03:37:14
  • resty upload无需依赖的文件上传与下载

    2023-01-17 14:54:31
  • SpringBoot异步任务使用方法详解

    2021-08-07 07:57:02
  • JavaWeb简单文件上传流程的实战记录

    2023-04-02 09:14:59
  • 关于maven全局配置文件settings.xml解析

    2023-01-08 09:04:04
  • 简单实现Java版学生管理系统

    2022-06-22 15:16:19
  • Java多线程之同步锁-lock详解

    2023-12-16 14:40:08
  • 基于Android本地代码生成器详解

    2022-09-15 02:52:26
  • java实现的DES加密算法详解

    2022-10-01 09:51:11
  • Java中使用Lambda表达式和函数编程示例

    2022-05-06 03:30:40
  • java 利用反射获取内部类静态成员变量的值操作

    2023-03-28 21:30:04
  • C#实现基于Base64的加密解密类实例

    2023-02-09 19:35:57
  • asp之家 软件编程 m.aspxhome.com