swift的靜態屬性(方法)和java的不一樣

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);
	}

	
}
相關文章
相關標籤/搜索