我注意到编译器不允许我用另一个存储值覆盖存储的属性(这似乎很奇怪):
class Jedi {
var lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor = "Red" // Cannot override with a stored property lightSaberColor
}
Run Code Online (Sandbox Code Playgroud)
但是,我允许使用计算属性执行此操作:
class Jedi {
let lightSaberColor = "Blue"
}
class Sith: Jedi {
override var lightSaberColor : String{return "Red"}
}
Run Code Online (Sandbox Code Playgroud)
为什么我不允许给它另一个值?
为什么用存储的属性覆盖令人憎恶的东西并用计算的一个犹太教来做?他们在想什么?
我尝试了解很多次,但我没理解这一点.
封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术.如果某个字段被声明为私有,则该类之外的任何人都无法访问该字段,从而将该字段隐藏在该类中.
我们如何通过setter方法更改字段的值?我们如何防止直接访问字段?封装的真正用途是什么?
我知道这种行为,但我不确定为什么会这样.
据我所知,java中的实例变量没有多态性.变量由编译器静态解析.
但在下面我对某些事感到困惑:
class Animal{
String name = "Animal";
public void display(){
System.out.println("My name is "+ name);
}
}
public class Dog extends Animal {
String name = "Dog";
public static void main(String[] args) {
Animal a = new Dog();
Dog d = new Dog();
System.out.println(a.name);//Line 1
a.display();//Line 2
d.display();//Line 3
}
}
Run Code Online (Sandbox Code Playgroud)
我认为Line 1它会显示Animal为静态类型a(由编译器解析).
让我困惑的是为什么Line 3还要展示My name is Animal?
将尝试调用该方法,Dog因为这是运行时的实际对象,因为它不会被覆盖,所以可以在父类中找到该方法Animal.
我没有得到的是为什么在操作的实际对象是a时,name在方法内部使用父类.它不隐藏父变量吗?在我看来它并不是因为类型是静态解析的.这不是oject的内存布局的一部分吗?
就像里面只有父的变量是可见的.为什么? display …