【发布时间】:2018-08-08 00:23:48
【问题描述】:
我是 Kotlin 的新手,我对 open 和 public 关键字感到困惑。谁能告诉我这些关键字之间的区别?
【问题讨论】:
-
如果您想进一步了解 Kotlin 中的“open”关键字android4dev.com/what-is-open-class-in-android-kotlin,请阅读本文
我是 Kotlin 的新手,我对 open 和 public 关键字感到困惑。谁能告诉我这些关键字之间的区别?
【问题讨论】:
open 关键字的意思是“开放扩展”:
类上的
open注解与Java的final相反:它允许其他人从这个类继承。 默认,Kotlin 中的所有类都是final,这对应于Effective Java,Item 17:Design and document for inheritance or else 禁止。
您还需要明确说明要使其可覆盖的方法,也标有open:
open class Base {
open fun v() {}
fun nv() {}
}
public 关键字充当可见性修饰符,可应用于类、函数等。
请注意,如果没有明确指定其他内容,public 是默认值:
如果您不指定任何可见性修饰符,则默认使用
public,这意味着您的声明将在任何地方可见
【讨论】:
public 可以从任何地方访问它。 open 允许继承类。谢谢!
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 中是相同的。
【讨论】:
public到底有什么用?如果使用open,则可以继承该类。制作类public的主要目的是什么?
我放在这里只是为了我的备忘录,也许对其他人有用:
open kotlin 中的类意味着一个类可以被继承,因为默认情况下它们不是:
class Car{....}
class Supercar:Car{....} : // give an error
open Car2{....}
class Supercar:Car2{....} : // ok
Java中的public类是关于类的可见性(与继承无关:除非Java中的类是final的,否则默认可以继承)。 在 kotlin 中,所有的类默认都是公开的。
kotlin 中的open 方法意味着该方法可以被覆盖,因为默认情况下它们不是。 相反,在 Java 中,所有方法都可以默认被覆盖
open 类的方法默认情况下不能像往常一样被覆盖(不管类是否打开),必须声明它们可以被覆盖:
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
}
【讨论】:
public:Kotlin 中的 public 关键字类似于 java,用于使类、方法、变量的可见性可以从任何地方访问。
open:在 Kotlin 中所有的类、函数和变量默认都是 final 的,通过继承属性,我们不能继承 final 类、final 函数和数据成员的属性。所以我们在类或函数或变量之前使用 open 关键字来使其可继承。
【讨论】:
open 成员但是你不能覆盖它。
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
不要混淆公开和公开。 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
}
【讨论】:
公开 VS 最终 VS 公开
打开:
- Kotlin:公开 A 类 () {}
- Java:A 类 () {}
最终:
- Kotlin:A 类 () {}
- 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
}
【讨论】:
所有classes、methods和members默认都是public,但不是open
kotlin 中的关键字open 表示“开放扩展”
表示如果您希望任何类成为 inherited 任何子类或 method 在子类中被覆盖,您必须标记为 open 否则您将收到编译时错误
注意:abstract 类或方法默认为open,您无需显式添加。
【讨论】: