【Kotlin学习日记】Day11:可见性修饰符

大家好,我是William李梓峰,欢迎加入我的Kotlin学习之旅。
今天是我学习 Kotlin 的第十一天,内容是 Visibility Modifiers - 可见性修饰符。

官方文档:

Visibility Modifiers - 可见性修饰符

Classes, objects, interfaces, constructors, functions, properties and their setters can have visibility modifiers. (Getters always have the same visibility as the property.)
类、对象、接口、构造器、函数、属性还有属性的 setter,都可以设置“可见性修饰符”。(getter 的可见性修饰符总是与属性的看齐。)

There are four visibility modifiers in Kotlin: private, protected, internal and public. The default visibility, used if there is no explicit modifier, is public.
Kotlin 总共有四种可见性修饰符:‘私有’、‘保护’、‘内置’ 和 ‘公有’。如果你没有显式地写可见性修饰符,那么默认就是用 ‘public’。(跟 Java 默认用的是 ‘default’ 不一样)

Below please find explanations of these for different type of declaring scopes.
下面请查看不同声明域的解释。

Packages - 包级域

Functions, properties and classes, objects and interfaces can be declared on the "top-level", i.e. directly inside a package:
函数、属性、类、对象和接口都可以顶级声明,也就是在包内独立声明:

// file name: example.kt
package foo            // 包 foo

fun baz() {}              // baz() 顶级方法
class Bar {}             // 顶级类 Bar
  • If you do not specify any visibility modifier, public is used by default, which means that your declarations will be visible everywhere;
  • If you mark a declaration private, it will only be visible inside the file containing the declaration;
  • If you mark it internal, it is visible everywhere in the same module;
  • protected is not available for top-level declarations.
  • 如果你没有指定任何可见性修饰符,‘public’ 就是默认指定的了(上面讲过了)
  • 如果你写了一个 ‘private’,它就只能在文件内部可见。(不能被别的文件
    import)
  • 如果你写了个 ‘internal’,它就只能在模块内部可见。(模块是啥?)
  • ‘protected’ 不能用在顶级声明上。

Examples:

// file name: example.kt
package foo

private fun foo() {} // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt
    
internal val baz = 6    // visible inside the same module

Classes and Interfaces - 类级域和接口级域

For members declared inside a class:
对于声明类的成员来说:

  • private means visible inside this class only (including all its members);
  • protected --- same as private + visible in subclasses too;
  • internal --- any client inside this module who sees the declaring class sees its internal members;
  • public --- any client who sees the declaring class sees its public members.
  • ‘private’,即只能在类的内部可见(同样对类的其他成员可见);
  • ‘protected’,即包含了 ‘private’ 的功能,同时还能对子类可见;
  • ‘internal’,即对任何调用方,只要是在这个模块内的都可见。
  • ‘public’,即对任何调用方都可见。

NOTE for Java users: outer class does not see private members of its inner classes in Kotlin.
注意, Java 开发者在玩 Kotlin 的时候请注意:外部类不可以看见其内部类的私有成员。(不太理解这句话什么意思,等以后介绍 Java 集成 Kotlin的时候再细细体会,现在别纠结,重点还是理解上面四个可见性修饰符的定义,毕竟跟 Java 的有点不同,尤其是多了一个支持模块化的 ‘internal’。)

If you override a protected member and do not specify the visibility explicitly, the overriding member will also have protected visibility.
如果你复写了一个 ‘protected’ 的成员,并且没有显式地重新指定一个可见性修饰符,那么复写后的成员还是 ‘protected’ 的。

Examples:

open class Outer {
    private val a = 1                      // 只有Outer内部可见
    protected open val b = 2         // 只有Outer内部和子类可见
    internal val c = 3                        // 模块内可见
    val d = 4  // public by default       // 全世界都可见
    
    protected class Nested {           // 内部类首次登场
        public val e: Int = 5          // 内部类在后面有介绍,这里先不管
    }
}

class Subclass : Outer() {            // 继承了 Outer 类
    // a is not visible
    // b, c and d are visible
    // Nested and e are visible

    override val b = 5   // 'b' is protected
}

class Unrelated(o: Outer) {          // 构造器形参写了 Outer 类的 o 对象
    // o.a, o.b are not visible
    // o.c and o.d are visible (same module)
    // Outer.Nested is not visible, and Nested::e is not visible either 
}

Constructors - 构造器级域

To specify a visibility of the primary constructor of a class, use the following syntax (note that you need to add an explicit constructor{: .keyword } keyword):
主要构造器的可见性修饰符需要在构造器前面写:

class C private constructor(a: Int) { ... }   // 私有构造器参上

Here the constructor is private. By default, all constructors are public, which effectively amounts to them being visible everywhere where the class is visible (i.e. a constructor of an internal class is only visible within the same module).
这里的构造器是私有的。默认情况下,所有的构造器都是 ‘public’ 的,这样子意味着世界上任何一个角落都可以访问这些构造器。(一个 ‘internal’的类的构造器仅仅可以在其模块中访问,什么是模块?)

Local declarations - 局部声明

Local variables, functions and classes can not have visibility modifiers.
局部变量,局部函数,局部类不可以有任何可见性修饰符。

Modules - 模块

The internal visibility modifier means that the member is visible with the same module. More specifically,
a module is a set of Kotlin files compiled together:
‘internal’ 意思就是其成员在同一个模块下都可见。更具体地说,一个模块有一系列的 Kotlin 文件编译在一起:

  • an IntelliJ IDEA module;

  • a Maven or Gradle project;

  • a set of files compiled with one invocation of the <kotlinc> Ant task.

  • 一个 IntelliJ IDEA 模块

  • 一个Maven或Gradle工程

  • 一些文件,它们用 Ant task 编译在一起

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,214评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,307评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,543评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,221评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,224评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,007评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,313评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,956评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,441评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,925评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,018评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,685评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,234评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,240评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,464评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,467评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,762评论 2 345

推荐阅读更多精彩内容

  • Java中有可见性修饰符(private...),而Kotlin中也是有这样的修饰符,但也有一些不一样,下面来学习...
    叫我旺仔阅读 3,206评论 0 5
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,145评论 9 118
  • 第四天 20170201 四点钟中心的钟声准时响起,这一天对钟声不在排斥,对这悠远敦厚的声音还有些欣赏,感觉这越来...
    月青山阅读 349评论 2 0
  • /本文虽然有一部分跟剑侠情缘手游的设定是一致的,但我还是做了很多改动,并且背景交代详细,没有接触过手游的也可以看得...
    怜舟芷卉阅读 356评论 0 8
  • 她是谁,或者,它是谁?没有一个答案,在茫茫人海中。 他走了,走的仓忙,来不及回头,双目无神。 却是,要仰天在...
    Bensen阅读 235评论 0 0