【Kotlin】Kotlin学习六-可见性修饰符

学而不思则罔,思而不学则殆


可见性修饰符

类、对象、接口、构造函数、方法、属性和它们的 setter 都可以有 可见性修饰符。 (getter总是与属性有着相同的可见性。) 在 Kotlin 中有这四个可见性修饰符: private 、protected 、 internal 和 public 。 如果没有显式指定修饰符的话,默认可见性是public

可见性修饰符对比

修饰符KotlinJAVA
public所有类可见(默认)所有类可见
private本类可见本类可见
protected本类,子类可见本类,子类,同一包路径下可见
default同一包路径下可见(默认)
internal同一模块的类可见

  • 如果你不指定任何可见性修饰符,默认为 public ,这意味着你的声明将随处可见;
  • 如果你声明为 private ,它只会在声明它的文件内可见;
  • 如果你声明为 internal ,它会在相同模块内随处可见;
  • protected 不适用于顶层声明。

注意:要使用另一包中可见的顶层声明,仍需将其导入进来

package com.algorithm

// 文件名:TestOne.kt

private fun foo() {} // 在 TestOne.kt 内可见

public var bar: Int = 5 // 该属性随处可见
    private set // setter 只在 TestOne.kt 内可见
internal val baz = 6 // 相同模块内可见

类和接口

对于类内部声明的成员:

  • private 意味着只在这个类内部(包含其所有成员)可见;
  • protected —— 和 private 一样 + 在子类中可见。
  • internal —— 能见到类声明的 本模块内 的任何客户端都可见其 internal 成员;
  • public —— 能见到类声明的任何客户端都可见其 public 成员。

请注意在 Kotlin 中,外部类不能访问内部类的 private 成员。
如果你覆盖一个 protected 成员并且没有显式指定其可见性,该成员还会是 protected 可见性。

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4 // 默认 public

    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a 不可见
    // b、c、d 可见
    // Nested 和 e 可见
    override val b = 5 // “b”为 protected
    fun show(): Unit {
        println("$b $c $d")
        Nested().e
    }
}

class Unrelated(o: Outer) {
    // o.a、o.b 不可见
    // o.c 和 o.d 可见(相同模块)
    // Outer.Nested 不可见,Nested::e 也不可见
    init {
        println("${o.c} ${o.d}")
    }
}

构造函数

要指定一个类的的主构造函数的可见性,使用以下语法(注意你需要添加一个显式constructor 关键字):

open class A private constructor(a: Int) {}
open class B public constructor(a: Int) {}
open class C internal constructor(a: Int) {}
open class D protected constructor(a: Int) {}

在这里插入图片描述

public灰显,说明默认是public
这里的构造函数是私有的。默认情况下,所有构造函数都是 public ,这实际上等于类可见的地方它就可见(即 一个 internal 类的构造函数只能在相同模块内可见).

局部声明

局部变量、函数和类不能有可见性修饰符。

模块

可见性修饰符 internal 意味着该成员只在相同模块内可见。更具体地说, 一个模块是编译在一起的一套 Kotlin 文件:

  • 一个 IntelliJ IDEA 模块;
  • 一个 Maven 项目;
  • 一个 Gradle 源集(例外是 test 源集可以访问 main 的 internal 声明);
  • 一次 Ant 任务执行所编译的一套文件
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值