在Kotlin中,“公开”和“公共”有什么区别?

vfhzx4xs  于 2023-02-05  发布在  Kotlin
关注(0)|答案(8)|浏览(164)

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

roejwanj

roejwanj1#

open关键字表示“开放扩展”-即可以创建open类的 * 子类 *:

上的open注解与Java的final相反:它允许其他人继承这个类。* 默认情况下 *,Kotlin中的所有类都是final,对应于Effective Java,Item 17:设计和记录继承或禁止

你还需要明确你想要重写的方法,同样用open标记:

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

public关键字相当于visibility modifier,可以应用于类、函数、成员函数等。如果顶级类或函数是public,则意味着它可以从其他文件使用,包括从其他模块使用。请注意,如果没有显式指定其他内容,则public是默认值:
如果不指定任何可见性修饰符,则缺省情况下使用public,这意味着您的声明在任何地方都是可见的

pdtvr36n

pdtvr36n2#

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也一样。

56lgkhnf

56lgkhnf3#

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

    • open**class在kotlin中表示类可以被继承,因为默认情况下它们不是:
class Car{....}
 class Supercar:Car{....} : // give an error

 open Car2{....}
 class Supercar:Car2{....} : // ok
    • public**class在Java中是关于类的可见性(与继承无关:除非java中的类是final的,否则默认情况下可以继承).在kotlin中,所有的类默认情况下都是public的.
    • open**method在kotlin中表示该方法可以被覆盖,因为默认情况下它们不能被覆盖。相反,在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

rkttyhzu

rkttyhzu4#

public:Kotlin中的public关键字类似于java,用于使类、方法、变量的可见性可从任何地方访问。
open:在Kotlin中,所有的类、函数和变量都默认为final,并且根据继承属性,我们不能继承final类、final函数和数据成员的属性,所以我们在类、函数或变量之前使用open关键字,使其可继承。

vsikbqxv

vsikbqxv5#

open和java中的Final是相反的,如果类不是'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
}
pprl5pva

pprl5pva6#

默认情况下,所有classesmethodsmembers都是public,但不是open
Kotlin中的关键字open表示“开放扩展”
表示如果您希望任何类被任何子类覆盖为inherited,或者method在子类中被覆盖,则必须标记为open,否则将出现编译时错误
注意:abstract类或方法默认为open,您不需要显式添加。

tpxzln5u

tpxzln5u7#

    • 公开VS最终VS公开**

开放:
1.子类可以访问它,因为它们被它的父类继承。
1.在Kotlin中,您需要添加'open'关键字,这与java不同,java的所有类在默认情况下都是'open'的。

  1. Kotlin:开放类A(){}
  2. Java:类A(){}
    最终:
    1.子类无法访问或继承。
    1.在JAVA中,您需要添加'final'关键字,这与kotlin不同,kotlin的所有类在默认情况下都是'final'。
  3. Kotlin:A类(){}
  4. 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
}
lrpiutwd

lrpiutwd8#

总结答案(Kotlin)

  • 类、方法和属性声明的默认值是**(public + final)**。final防止任何继承尝试。
  • 为了能够扩展一个,必须用open关键字标记类。
  • 为了能够覆盖****方法属性**,除了使用override关键字标记覆盖方法或参数之外,还必须在parent类中使用open关键字标记它们。
    *public只是封装,它影响类/方法的可见性。Public将使它们在任何地方都可见。

参考文献

相关问题