swift在任何情况下静态属性都要加上类名做为前缀,在java中通过实例名使用静态属性是一个warning,在swift中这里是一个错误
class Dog { static var name: String { return "xiaohua" } func bark(){ // error: static member 'name' cannot be used on instance of type 'Dog' // 和java不一样,在instance method中不能直接访问static属性而必须要加类名. // print(name);这行出错! swift默认为加上self.前缀. print(Dog.name) // 动态获取类名的写法 print(self.dynamicType.name) // 和上面的写法等价 print(self.dynamicType.self.name) } } var d = Dog() d.bark() // 使用实例名调用静态属性在swift中是一个错误 // error: static member 'name' cannot be used on instance of type 'Dog' // print(d.name)
swift中的static属性(默认就是final) === swift中的final class==== java中的final static
swift多出了class 属性这个概念,用来表示`可以被子类重写的static属性`,然并卵,我觉得不如直接使用static 和 final static,少一种概念
class Animal { final class var name: String { return "animal" } var age: Int = 5 } class Cat: Animal { // error: class var overrides a 'final' class var override class var name: String { return "cat" } }
swift中子类不能覆盖父类的stored property,但是可以覆盖父类的computed property,在java中,属性并没有override一说,没有定义就会使用父类的,有定义就会使用子类的.
相应的java代码如下:
package test; import static java.lang.System.out; public class Dog { static String name = "xiaohua"; void bark() { out.println(name); } public static void main(String[] args) { Dog d = new Dog(); d.bark(); // Warning: The static field Dog.name should be accessed in a static way String name = d.name; out.println(name); Cat c = new Cat(); c.speak(); } } class Animal { // java中的属性即使标记为final也可以被子类覆盖 ?? 很久没写java都有点surprising! // 应该是java中的属性并没有覆盖这一说法,修饰为final只是为了将其定义为一个常量. protected final String name = "animal"; public final static String getName() { return "animal"; } } class Cat extends Animal { // 没有错误 public String name = "cat"; void speak(){ out.println(this.name); } }原文链接:https://www.f2er.com/swift/323664.html