在 Kotlin,「开放」与「公开」有何分别?

我是新的科特林和我之间的 openpublic关键字混淆。有人能告诉我这些关键词之间的区别吗?

42605 次浏览

open关键字的意思是“打开扩展”——也就是说,可以创建 open类的 子类:

同学们上的 open注释与 Java 的 final相反: 它允许其他人从这个类继承。到了 违约,Kotlin 的所有课程都是 final,相当于 有效 Java,第17项: 为继承而设计和编写文档,否则禁止继承

您还需要明确说明要使其可重写的方法,这些方法也用 open标记:

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

public关键字充当可以应用于类、函数、成员函数等的 可见度修饰符可见度修饰符。如果顶级类或函数是 public,则意味着可以从其他文件使用它,包括从其他模块使用它。请注意,如果没有显式指定其他内容,则 public为默认值:

如果不指定任何可见性修饰符,则默认情况下使用 public,这意味着您的声明将在任何地方都可见

在爪哇的 abc0等于在 Kotlin 的 open class A { ... }
在爪哇的 abc0等于在 Kotlin 的 class B { ...}

public无关。

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

那么,

public class A { ... }

还有

class A { ... }

在 Kotlin 也一样。

Open 是 java 中 Final 的对立面。 如果类不是“打开的”,则不能继承它。

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
}

我放在这里只是为了写备忘录,也许对别人有用:

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
}

详情请浏览: https://kotlinlang.org/docs/reference/classes.html

所有的 classesmethodsmembers在默认情况下都是 public,但不是 open

关键词 open在 kotlin 中的意思是“开放扩展”

意味着如果你想要任何类是 inherited的任何子类或者 method在子类中被覆盖,你必须标记为 open否则你会得到编译时错误

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

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

Open : 在 Kotlin,所有的类、函数和变量在默认情况下都是 final,并且通过继承属性,我们不能继承 final 类、 final 函数和数据成员的属性。因此,我们在类、函数或变量之前使用 open 关键字,使其成为可继承的。

公开 VS 决赛 VS 公开

开放:

  1. 子类可以访问它,因为它们是由其父类继承的。
  2. 在 Kotlin,你需要添加“ open”关键字,而 java 默认所有类都是“ open”的 例如:
  1. Kotlin: 打开类 A (){}
  2. 类 A (){}

最后:

  1. 子类不能访问或继承。
  2. 在 JAVA 中,你需要添加‘ final’关键字,而 kotlin 的所有类在默认情况下都是‘ final’关键字 例如:
  1. 科特林: A 类(){}
  2. 最终类 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
}