Kotlin 中的 'open' 和 'public' 有什么区别?
What is the difference between 'open' and 'public' in Kotlin?
我是 Kotlin 的新手,我对 open
和 public
关键字感到困惑。谁能告诉我这些关键字之间的区别?
open
关键字表示“开放扩展” - 即可以创建 subclasses open
class:
The open
annotation on a class is the opposite of Java's final
: it allows others to inherit from this class. By default, all classes in Kotlin are final
, which corresponds to Effective Java, Item 17: Design and document for inheritance or else prohibit it.
您还需要明确说明要覆盖的方法,也标有 open
:
open class Base {
open fun v() {}
fun nv() {}
}
public
关键字充当 visibility modifier 可以应用于 classes、函数、成员函数等。如果 top-level class 或者函数是 public
,这意味着它可以从其他文件中使用,包括从其他模块中使用。请注意,如果没有明确指定其他内容,则 public
是默认值:
If you do not specify any visibility modifier, public
is used by default, which means that your declarations will be visible everywhere
class A { ... }
在 Java 中等于 open class A { ... }
在 Kotlin 中。
Java 中的 final class B { ... }
等于 Kotlin 中的 class B { ...}
。
与public
无关。
在 Kotlin 中,所有没有访问修饰符的东西默认都是 public
。您可以在定义中明确地说 public
,但在 Kotlin 中没有必要。
所以,
public class A { ... }
和
class A { ... }
在 Kotlin 中是一样的。
open 与 java 中的 Final 相反。
如果class不是'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
}
我放在这里只是为了备忘,也许对其他人有用:
open class 在 kotlin 中意味着一个 class 可以被继承,因为默认情况下它们不是:
class Car{....}
class Supercar:Car{....} : // give an error
open Car2{....}
class Supercar:Car2{....} : // ok
public class in Java 是关于 class 的可见性(与继承无关:除非java中的class是final的,可以默认继承)。
在 kotlin 中,所有 class 默认情况下都是 public。
open kotlin 中的方法意味着该方法可以被覆盖,因为默认情况下它们不是。
相反,在 Java 中,所有方法都可以默认覆盖
openclass的方法不能像往常一样默认被覆盖(如果class打开了也没关系),他们必须声明它们可以被覆盖:
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
}
所有 classes
、methods
和 members
默认为 public
但不是 open
关键字open
在kotlin中的意思是"Open for Extension"
意味着如果你想让任何 class 被任何 subclass 或 method
inherited
在 subclasses 中覆盖,你必须标记为 open
否则你会得到编译时错误
注意:abstract
classes 或方法默认为 open
,您无需显式添加。
public:Kotlin 中的 public 关键字类似于 java 它用于使 class 可见es、方法、变量可以从任何地方访问。
open:在Kotlin中所有classes,函数,变量默认都是final的,通过继承属性,我们不能继承属性 的 final classes、final 函数和数据成员。所以我们在 class 或函数或变量之前使用 open 关键字来使其可继承。
公开赛 VS 决赛 VS PUBLIC
打开:
- child class 可以访问它,因为它们被其 parent.
继承
- 在 Kotlin 中你需要添加 'open' 关键字不像 java 默认情况下所有 class 都是 'open'
示例:
- Kotlin : open class A () {}
- Java : class A () {}
决赛:
- child class 无法访问或继承。
- 在 JAVA 中你需要添加 'final' 关键字不像 kotlin 默认情况下所有 class 都是 'final'
示例:
- Kotlin : class A () {}
- Java : final class A () {}
PUBLIC : 任何 class 无论其继承与否都可以访问其数据或方法。
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
}
我是 Kotlin 的新手,我对 open
和 public
关键字感到困惑。谁能告诉我这些关键字之间的区别?
open
关键字表示“开放扩展” - 即可以创建 subclasses open
class:
The
open
annotation on a class is the opposite of Java'sfinal
: it allows others to inherit from this class. By default, all classes in Kotlin arefinal
, which corresponds to Effective Java, Item 17: Design and document for inheritance or else prohibit it.
您还需要明确说明要覆盖的方法,也标有 open
:
open class Base {
open fun v() {}
fun nv() {}
}
public
关键字充当 visibility modifier 可以应用于 classes、函数、成员函数等。如果 top-level class 或者函数是 public
,这意味着它可以从其他文件中使用,包括从其他模块中使用。请注意,如果没有明确指定其他内容,则 public
是默认值:
If you do not specify any visibility modifier,
public
is used by default, which means that your declarations will be visible everywhere
class A { ... }
在 Java 中等于 open class A { ... }
在 Kotlin 中。
Java 中的 final class B { ... }
等于 Kotlin 中的 class B { ...}
。
与public
无关。
在 Kotlin 中,所有没有访问修饰符的东西默认都是 public
。您可以在定义中明确地说 public
,但在 Kotlin 中没有必要。
所以,
public class A { ... }
和
class A { ... }
在 Kotlin 中是一样的。
open 与 java 中的 Final 相反。 如果class不是'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
}
我放在这里只是为了备忘,也许对其他人有用:
open class 在 kotlin 中意味着一个 class 可以被继承,因为默认情况下它们不是:
class Car{....}
class Supercar:Car{....} : // give an error
open Car2{....}
class Supercar:Car2{....} : // ok
public class in Java 是关于 class 的可见性(与继承无关:除非java中的class是final的,可以默认继承)。 在 kotlin 中,所有 class 默认情况下都是 public。
open kotlin 中的方法意味着该方法可以被覆盖,因为默认情况下它们不是。 相反,在 Java 中,所有方法都可以默认覆盖
openclass的方法不能像往常一样默认被覆盖(如果class打开了也没关系),他们必须声明它们可以被覆盖:
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
}
所有 classes
、methods
和 members
默认为 public
但不是 open
关键字open
在kotlin中的意思是"Open for Extension"
意味着如果你想让任何 class 被任何 subclass 或 method
inherited
在 subclasses 中覆盖,你必须标记为 open
否则你会得到编译时错误
注意:abstract
classes 或方法默认为 open
,您无需显式添加。
public:Kotlin 中的 public 关键字类似于 java 它用于使 class 可见es、方法、变量可以从任何地方访问。
open:在Kotlin中所有classes,函数,变量默认都是final的,通过继承属性,我们不能继承属性 的 final classes、final 函数和数据成员。所以我们在 class 或函数或变量之前使用 open 关键字来使其可继承。
公开赛 VS 决赛 VS PUBLIC
打开:
- child class 可以访问它,因为它们被其 parent. 继承
- 在 Kotlin 中你需要添加 'open' 关键字不像 java 默认情况下所有 class 都是 'open' 示例:
- Kotlin : open class A () {}
- Java : class A () {}
决赛:
- child class 无法访问或继承。
- 在 JAVA 中你需要添加 'final' 关键字不像 kotlin 默认情况下所有 class 都是 'final' 示例:
- Kotlin : class A () {}
- Java : final class A () {}
PUBLIC : 任何 class 无论其继承与否都可以访问其数据或方法。
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
}