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

时间:2018-02-28 07:35:18

标签: kotlin keyword public

我是Kotlin的新手,我对openpublic个关键字感到困惑。有人可以告诉我这些关键词之间的区别吗?

7 个答案:

答案 0 :(得分:26)

open关键字表示“打开扩展名”:

  

上的open注释与Java的final相反:它允许其他人继承此类。通过默认,Kotlin中的所有类都是final,它对应于有效Java,第17项:继承的设计和文档,或者禁止它

您还需要明确表示要覆盖的方法,并标有open

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

public关键字充当可见性修饰符,可应用于类,函数等。 请注意,如果没有明确指定其他内容,public是默认值:

  

如果您未指定任何可见性修饰符,则默认使用public,这意味着您的声明随处可见

答案 1 :(得分:4)

Java中的

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

public无关。

在Kotlin中,默认情况下,没有访问修饰符的所有内容都是public。您可以在定义中明确说出public,但在Kotlin中没有必要。

所以,

public class A { ... }

class A { ... }

在Kotlin中是一样的。

答案 2 :(得分:3)

我在这里只是为了备忘,可能对其他人有用:

Kotlin中的

open 类意味着可以继承一个类,因为默认情况下它们不是:

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

 open Car2{....}
 class Supercar:Car2{....} : // ok
Java中的

public 类与类的可见性有关(与继承无关:除非Java中的类是final,否则默认情况下可以继承)。 在kotlin中,默认情况下所有类都是公共的。

Kotlin中的

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

打开类的方法默认情况下不能像往常一样被覆盖(无论该类是否打开),必须声明它们可以被覆盖:

 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
 }

了解更多详细信息:documentation

答案 3 :(得分:1)

open与Java中的Final相反。 如果该类不是“开放”类,则无法继承。

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
}

答案 4 :(得分:1)

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

打开:在Kotlin中,默认情况下,所有类,函数和变量均为final,而根据继承属性,我们无法继承final类,final函数和数据成员的属性。因此,我们在类,函数或变量之前使用open关键字,以使其具有可继承性。

答案 5 :(得分:0)

默认情况下,所有classesmethodsmembers均为public,但不是open

kotlin中的关键字open表示“开放扩展”

表示如果您希望任何类被任何子类inherited或要在子类中覆盖method,则必须将其标记为open,否则会出现编译时错误

注意:默认情况下,abstract类或方法是open,您无需显式添加。

答案 6 :(得分:0)

公开 VS 最终 VS 公开

打开:

  1. 子类可以访问它,因为它们被其父类继承。
  2. 在 Kotlin 中,您需要添加 'open' 关键字,这与默认情况下所有类都是 'open' 的 java 不同 示例:
<块引用>
  1. Kotlin:开放类 A () {}
  2. Java:A 类 () {}

最终:

  1. 子类无法访问或继承。
  2. 在 JAVA 中,您需要添加 'final' 关键字,这与 kotlin 的所有类默认为 'final' 不同 示例:
<块引用>
  1. Kotlin:A 类 () {}
  2. Java:最终类 A () {}

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

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
}