static vs non-static

来源:转载

static与non-static的区别。可以这样理解。

某个对象的特性分为类特性与实例特性。类特性是与类相关的。如

class Student{
static int numberOfStudent;
........
}

这里numberOfStudent是学生数。是与Student类相关的一个数据。
而实例特性是每个对象本身自己的特性。如:

class Student{
int number;
String name;
........
}

这里的number(学号),name(姓名)。是与每个对象自身相关的。

static与non-static是对立的。static应当(注意是应当)使用类名来引用。而non-static必须(是必须)使用对象实例名来引用。

static与non-static在引用数据成员方面的差别:因为static、non-static的数据相关性,static只能引用类的static数据成员;而non-static既可以引用类的static数据成员,也可以引用对象自身的数据。

static与non-static method在overload方面是一样的。

而static与non-static method在override方面则完全不同。static方法是与类相关的,不是通过this引用的,所以它不能被override。其引用在编译期就得确定。而non-static方法才有可能被override。

static与abstract,它们不能同时用于修饰一个方法。因为abstract的语义就是说这个方法是多态方法,需要subclass的实现。而static方法则是在本类中实现的,编译期绑定,不具有多态行为。

static与interface,interface中的method也不能是static的。理由同上。但其数据成员 are all static, no matter you mark it static or not 。

多态只限于方法,所以,无论static还是non-static的成员变量,引用的是哪个在编译期就已经确定。

[补充]
static与final。在C与C++中经常在函数与全局里面使用static变量。它的语义与Java里面static的语义已经不同。C与C++中 static的语义是,“其生命期不依赖于该函数作用域,而其作用域(可引用该变量的范围)仅限于该函数作用域。在函数第一次执行时被初始化,当函数返回时其值依然存在。”
而Java里面的static则如前所说,”将变量或者方法(注意这里可以修饰方法)与类绑定,指定与类相关”。
final在修饰变量时表示“变量不可变”,近似于C++里面的const。而其修饰方法时,指示实例方法不可被override。而static修饰的是类方法。其绑定机制指示其不可被override。
static与final可以同时修饰一个方法,这样并不会有语法错误。但是别这么用。在画蛇添足以外,还会让人怀疑你对Java语言的认识程度。



分享给朋友:
您可能感兴趣的文章:
随机阅读: