Kotlin可见性修饰符详解:public, protected, internal, private

在本教程中,我们将讨论Kotlin编程中可用的各种可见性修饰符。

Kotlin的可见性修饰符

可见性修饰符是一种修饰符,当附加到Kotlin中的类/接口/属性/函数上时,将定义其可见性范围以及可以从何处进行访问。Kotlin中属性的设置器可以具有不同于属性的修饰符。获取器无法定义可见性修饰符,它们使用与属性相同的修饰符。以下是可见性修饰符:

  • public(公共)
  • protected(受保护)
  • internal(内部)
  • private(私有)

公共修饰符(public

在Kotlin中,public修饰符是默认的修饰符。就像Java中的public修饰符一样,它意味着声明在任何地方都是可见的。


class Hello{
}

public class H{
}

fun hi()
public fun hello()

val i = 0
public val j = 5

以上声明都在文件的顶层。所有声明都是公共的。如果我们没有明确指定类成员的修饰符,它们默认是公共的(除非它们被覆盖)。

受保护的修饰符(protected

Kotlin中的protected修饰符:无法用于顶层声明。在一个类中,受保护的声明只能在其子类中访问。

open class Pr{
    protected val i = 0
}

class Another : Pr(){

    fun iValue() : Int
    {
        return i
    }
}

除非你明确将其修改,否则没有继承Pr类的类无法访问具有protected修饰符的i声明,即使在子类中被重写时也要保持相同的protected修饰符。

open class Pr{
    open protected val i = 0
}

class Another : Pr(){

    fun iValue() : Int
    {
        return i
    }
    
    override val i = 5 //protected visibility
}

在Kotlin中定义的protected修饰符概念与Java中的有所不同。

内部修饰符(internal

在Kotlin中,internal是一种新的修饰符,而Java中则不存在。将声明设置为internal意味着它只能在同一个模块中使用。在Kotlin中,我们所说的模块是指一组一起编译的文件。

internal class A {
}

internal val x = 0

当你需要将特定的库实现隐藏在用户外部时,internal修饰符非常有用,因为它对于当前模块之外是不可见的。在Java中,使用包私有可见性是无法实现这种效果的。

私有修饰符(private

private修饰符不允许在当前范围之外的地方看到声明。

var setterVisibility: String = "abc"
    private set

open class Pr{
    open protected val i = 0

    fun iValue() : Int
    {
        // setterVisibility = 10 // 编译错误:类型不匹配,应为String
        return setterVisibility.length // 示例:返回字符串长度
    }
}

由于Kotlin允许多个顶层定义,上述代码是有效的。下面的代码是无效的。

private open class ABC{
    private val x = 6
}

private class BDE : ABC()
{
    fun getX()
    {
        // return x // 编译错误:x不能在此处访问,因为它是私有的
    }
}

x只能从它所属的类内部看到。我们可以用以下方式设置私有构造函数:

class PRIV private constructor(a: String) {
 // ... 
}

默认情况下,类具有公共的构造函数。无论类在哪里,构造函数都会跟随。我们需要在定义本身上设置构造函数的可见性修饰符。因此,Kotlin与Java不同地使用了protectedinternal修饰符。另外,Java的默认修饰符是package-private,在Kotlin中不存在。这就结束了有关Kotlin可见性修饰符的快速教程。

bannerAds