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); } }总结
以上是内存溢出为你收集整理的swift的静态属性(方法)和java的不同全部内容,希望文章能够帮你解决swift的静态属性(方法)和java的不同所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)