-
Notifications
You must be signed in to change notification settings - Fork 0
/
关于kotlin中属性重写的思考🤔
95 lines (74 loc) · 1.96 KB
/
关于kotlin中属性重写的思考🤔
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
首先看一下kotlin的一个示例:
```kotlin
open class Pet{
open val name:String = "pet"
}
class Dog : Pet(){
override val name:String = "dog"
}
fun main(){
var dog:Pet = Dog()
println(dog.name)
}
//输出结果是“dog”
```
而在java中:
```java
class Pet{
public String name = "pet";
}
class Dog extends Pet{
public String name = "dog";
}
public class Test {
public static void main(String[] args) {
Pet dog = new Dog();
System.out.println(dog.name);
}
}
//输出结果是“pet“
```
怎么回事?不是说kotlin是100%兼容java的么?为什么一样的继承 ,实例化后调用属性的结果却不相同?
我们知道在java中 重写只发生在方法中。与实例的属性无关。当实例化子类后,子类也会实例化父类对象。当我们为name增加getter方法时候,再看一下:
```java
public class Test {
public static void main(String[] args) {
Pet dog = new Dog();
System.out.println(dog.name);
System.out.println(dog.getName());
}
}
class Pet{
public String name = "pet";
public String getName() {
return name;
}
}
class Dog extends Pet{
public String name = "dog";
@Override
public String getName() {
System.out.println(super.name+" ------");
return name;
}
}
//输出结果:
//pet
//pet ------
//dog
```
我们从这里面看到,getName方法重写了,调用后输出了子类的"dog"。
其实我们把kotlin代码编译后的二进制文件反编译后可以看到(方法android studio中tool—>show kotlin byte code—>decampile):
```java
public static final void main() {
Pet dog = (Pet)(new Dog());
String var1 = dog.getName();
boolean var2 = false;
System.out.println(var1);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
```
原来真正原因是在这里。kotlin调用属性使用的是get方法!