static关键字
在Java中,有50个关键字,static就是其中之一。
在声明中加上static的字段叫静态字段。可以被用来修饰成员变量,是静态变量;修饰方法表示静态方法。
1.修饰成员变量——静态变量
[访问限定词] static 数据类型 成员变量名 = 初值;
静态变量定义:
static修饰的变量也叫静态变量或类变量。当一个类的所有对象的某个成员变量或某几个成员变量都有相同的值时,应该将这样的成员变量称为静态变量或类变量。
static关键字不能修饰局部变量,包括实例方法和静态方法。
静态变量和实例变量的区别
静态变量:与实例个数无关,只有一个。实例变量:各个实例中都有一个。
静态变量存储在方法区,实例变量存储在堆。
静态变量与类有关,与对象无关,一个类一份静态变量,类所有的实例都共享静态变量。
类名.静态变量
class Employee{
private String name;
static int counter = 0; //静态变量,初始化为0,无限定词
public void 签到(){
System.out.println(name+"签到");
counter++;
}
public int 出勤人数(){
return counter;
}
}
·····
public class testDome{
public static void main(String[] args){
System.out.println("今日有"+Employee.counter+"人出勤");
}
}
实例变量与对象个数有关,是伴随着对象的,一个对象一份实例变量。可以用访问。
对象.实例变量
2.修饰方法——静态方法
静态方法不用于特定实例,而是用于与整个类相关的处理或者与类实例的状态无关的处理。静态方法与类有关,方法不存在this。静态方法无法访问同一个类中的实例变量和实例方法,不具有“自身持有的变量/方法”,只可以访问“大家共享的变量/方法”。调用方式是类名.静态方法。eg:Arrays.toString(...)
声明中未加static的方法在概念上是由各个实例分别创建的,属于该实例。该方法是属于各个实例的,称为实例方法。实例方法与对象有关,方法存在this。实例方法既可以访问“自身持有的变量/方法”,也可以访问“大家共享的变量/方法”。调用方式是对象.实例方法。eg:P1.eat(...)
final关键字
final修饰类
final修饰的类称为最终类
final class 类名
{ // TODO }
最终类不能派生子类,即类不能被继承。
定义最终类的目的是不希望父类中的成员变量被子类隐藏,以及方法被子类重写,可以对类起到保护作用。典型的最终类就是String 类。
final修饰方法
final修饰的方法称为最终方法。
[访问限定词] [static] final 方法类型 方法名([参数]){
// todo
}
最终方法可以被子类继承,但不能被子类重写。
final修饰成员变量
final修饰的成员变量称为最终成员变量,又称为常量。
[访问限定词] [static] final 数据类型 成员变量名 = 初值;
常量名一般都使用大写字母。定义常量时必须给出初值,不能用默认值。在程序运行过程中,常量的值不能改变。如果采用赋值的方式试图改变常量的值则会产生编译错误。
用static 修饰,常量成为类常量。因为没有必要让每一个对象都有一个相同的、单独的常量,所以应该让该常量成为类常量。
访问限定词为public,final修饰常量,则常量的值不能改变。在类之外能够访问这个常量也不改变其值,在类之外的其他地方都能够使用常量。