Kotlin 中的 'open' 和 'public' 有什么区别?

What is the difference between 'open' and 'public' in Kotlin?

我是 Kotlin 的新手,我对 openpublic 关键字感到困惑。谁能告诉我这些关键字之间的区别?

open 关键字表示“开放扩展” - 即可以创建 subclasses open class:

The open annotation on a class is the opposite of Java's final: it allows others to inherit from this class. By default, all classes in Kotlin are final, which corresponds to Effective Java, Item 17: Design and document for inheritance or else prohibit it.

您还需要明确说明要覆盖的方法,也标有 open:

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

public 关键字充当 visibility modifier 可以应用于 classes、函数、成员函数等。如果 top-level class 或者函数是 public,这意味着它可以从其他文件中使用,包括从其他模块中使用。请注意,如果没有明确指定其他内容,则 public 是默认值:

If you do not specify any visibility modifier, public is used by default, which means that your declarations will be visible everywhere

class A { ... } 在 Java 中等于 open class A { ... } 在 Kotlin 中。
Java 中的 final class B { ... } 等于 Kotlin 中的 class B { ...}

public无关。

在 Kotlin 中,所有没有访问修饰符的东西默认都是 public。您可以在定义中明确地说 public,但在 Kotlin 中没有必要。

所以,

public class A { ... }

class A { ... }

在 Kotlin 中是一样的。

open 与 java 中的 Final 相反。 如果class不是'open',则无法继承

class First{}
class Second:First(){}  // Not allowed. Since 'First' is Final(as in Java) by default. Unless marked "open" it can't be inherited 

不要混淆 open 和 public。 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
}

我放在这里只是为了备忘,也许对其他人有用:

open class 在 kotlin 中意味着一个 class 可以被继承,因为默认情况下它们不是:

 class Car{....}
 class Supercar:Car{....} : // give an error

 open Car2{....}
 class Supercar:Car2{....} : // ok

public class in Java 是关于 class 的可见性(与继承无关:除非java中的class是final的,可以默认继承)。 在 kotlin 中,所有 class 默认情况下都是 public。

open kotlin 中的方法意味着该方法可以被覆盖,因为默认情况下它们不是。 相反,在 Java 中,所有方法都可以默认覆盖

openclass的方法不能像往常一样默认被覆盖(如果class打开了也没关系),他们必须声明它们可以被覆盖:

 open class Car{
    fun steering{...}
 }
 class Supercar:Car{
    override fun steering {...}  // give an error
 } 

 open class Car2{
    open fun steering{...}
 }
 class Supercar:Car2{
    override fun steering {...}  // ok
 }

更多详情:https://kotlinlang.org/docs/reference/classes.html

所有 classesmethodsmembers 默认为 public 但不是 open

关键字open在kotlin中的意思是"Open for Extension"

意味着如果你想让任何 class 被任何 subclass 或 method inherited 在 subclasses 中覆盖,你必须标记为 open 否则你会得到编译时错误

注意:abstract classes 或方法默认为 open,您无需显式添加。

public:Kotlin 中的 public 关键字类似于 java 它用于使 class 可见es、方法、变量可以从任何地方访问。

open:在Kotlin中所有classes,函数,变量默认都是final的,通过继承属性,我们不能继承属性 的 final classes、final 函数和数据成员。所以我们在 class 或函数或变量之前使用 open 关键字来使其可继承。

公开赛 VS 决赛 VS PUBLIC

打开:

  1. child class 可以访问它,因为它们被其 parent.
  2. 继承
  3. 在 Kotlin 中你需要添加 'open' 关键字不像 java 默认情况下所有 class 都是 'open' 示例:
  1. Kotlin : open class A () {}
  2. Java : class A () {}

决赛:

  1. child class 无法访问或继承。
  2. 在 JAVA 中你需要添加 'final' 关键字不像 kotlin 默认情况下所有 class 都是 'final' 示例:
  1. Kotlin : class A () {}
  2. Java : final class A () {}

PUBLIC : 任何 class 无论其继承与否都可以访问其数据或方法。

Kotlin 中的示例:

//Final
class DemoA() {
    
    protected fun Method() {

    }

}

class DemoB() : DemoA {
    Method() // can't access
}

//OPEN
open class DemoA() {
    
    protected fun Method() {

    }

}

class DemoB() : DemoA {
    Method() // can access
}

//Public
class DemoA() {

    fun Method() {

    }

}

class DemoB()  {
    val a = DemoA()
    a.Method() // can access
}

Java 中的示例:

//FINAL
final class DemoA() {
    protected void name() {
        
    }
}

class DemoB() extends DemoA {
    name(); // Can't access
}

//Open
class DemoA() {
    protected void name() {
        
    }
}

class DemoB() extends DemoA {
    name(); // Can access
}

//Public
class DemoA() {
    void name() {
        
    }
}

class DemoB(){
    DemoA a = new DemoA()
    a.name(); // Can access
}