В чем разница между "открытым" и "общественным" в Котлине?

Я новичок в Kotlin, и меня путают между open и public ключевыми словами. Может ли кто-нибудь сказать мне разницу между этими ключевыми словами?

Ответ 1

Ключевое слово open означает "open for extension":

open аннотация в классе противоположна final Java: она позволяет другим наследовать от этого класса. По умолчанию все классы в Котлине являются final, что соответствует Эффективной Java, Пункт 17: Дизайн и документ для наследования, или же запретить его.

Также вам нужно быть явным о методах, которые вы хотите сделать переопределяемыми, также отмеченными с помощью open:

open class Base {
    open fun v() {}
    fun nv() {}
}

Ключевое слово public действует как модификатор видимости, который может применяться к классам, функциям и т.д. Обратите внимание, что public является значением по умолчанию, если ничего не указано явно:

Если вы не указали какой-либо модификатор видимости, public используется по умолчанию, что означает, что ваши объявления будут видны повсюду

Ответ 2

class A {... } в Java равен open class A {... } в Котлине.
final class B {... } в Java равен class B {...} в Котлине.

Это не связано с public.

В Котлин, все без модификаторов доступа является public по умолчанию. Вы можете явно public в определении, но это не обязательно в Котлине.

Так,

public class A { ... }

а также

class A { ... }

в Котлине одинаковы.

Ответ 3

open противоположен финалу в java. Если класс не "открытый", он не может быть унаследован.

class First{}
class Second:First(){}  // Not allowed. Since 'First' is private by default.

Не путайте с открытым и публичным. public - это модификатор видимости

class Third{}  // By default this is public
private class Fourth{}
class Fifth{
    val third = Third() // No issues
    val fourth = Fourth() // Can't access because Fourth is private
}