swift在任何狀況下靜態屬性都要加上類名作爲前綴, 在java中經過實例名使用靜態屬性是一個warning, 在swift中這裏是一個錯誤java
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 staticswift
swift多出了class 屬性這個概念, 用來表示`能夠被子類重寫的static屬性`, 然並卵, 我以爲不如直接使用static 和 final static, 少一種概念ide
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一說, 沒有定義就會使用父類的, 有定義就會使用子類的.this
相應的java代碼以下:code
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); } }