微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

swift的静态属性(方法)和java的不同

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

	
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐