类的可见性 - 图1
类的可见性 - 图2

  • 简单理解,模块相当于jar aar文件

类的可见性 - 图3

  • protected 不允许在文件定义
  1. open class Tree {
  2. protected class Stem {
  3. }
  4. }

internal

一般用在开发第三方SDK,不公开类,如果是 JAVA 可能导致层次混乱。

package com.example.kotlinpractice.core;

public class JavaCost {
      public void getCostByJava() {

    }
}
package com.example.kotlinpractice;


import com.example.kotlinpractice.core.JavaCost;

public class JavaAPI {
    private JavaCost javaCost = new JavaCost();

    void getCost() {
        javaCost.getCostByJava();
    }
}

JavaCost 与 JavaAPI 是不同的包路径,需要public才能访问,但是使用 public 把JavaCost类暴露了。Java的解决方案是把JavaCost 与 JavaAPI 放在同个包名下,当类原来越多时,这就导致代码层次结构混乱。

package com.example.kotlinpractice.core

internal class KotlinCost {
    internal fun getCostByKotlin() {}
}
package com.example.kotlinpractice

import com.example.kotlinpractice.core.KotlinCost

class KotlinAPI {
    private val kotlinCost = KotlinCost() //此处必须 private 或 internal,否则就暴露了
    fun getCost() {
        kotlinCost.getCostByKotlin()
    }
}