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