我是Kotlin的新手,我对open
和public
个关键字感到困惑。有人可以告诉我这些关键词之间的区别吗?
答案 0 :(得分:26)
open
关键字表示“打开扩展名”:
类上的
open
注释与Java的final
相反:它允许其他人继承此类。通过默认,Kotlin中的所有类都是final
,它对应于有效Java,第17项:继承的设计和文档,或者禁止它。
您还需要明确表示要覆盖的方法,并标有open
:
open class Base {
open fun v() {}
fun nv() {}
}
public
关键字充当可见性修饰符,可应用于类,函数等。
请注意,如果没有明确指定其他内容,public
是默认值:
如果您未指定任何可见性修饰符,则默认使用
public
,这意味着您的声明随处可见
答案 1 :(得分:4)
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)
默认情况下,所有classes
,methods
和members
均为public
,但不是open
kotlin中的关键字open
表示“开放扩展”
表示如果您希望任何类被任何子类inherited
或要在子类中覆盖method
,则必须将其标记为open
,否则会出现编译时错误
注意:默认情况下,abstract
类或方法是open
,您无需显式添加。
答案 6 :(得分:0)
公开 VS 最终 VS 公开
打开:
最终:
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
}