一、静态变量
在类中,用static声明的成员变量为静态成员变量,在第一次使用时被初始化,它为该类的公用变量,即对于该类的所有对象来说,static成员变量只有一份。
class Cat {
int id;
staic int sid;
}
对于非static变量id来说,只有new了Cat类的对象cat1时,才会在堆中为cat1划分一块内存区域,id变量就存放在这块内存区域中,而再new一个cat2对象时,又会重新再堆中划分一块内存区域,第二个id就在这块内存区域中···以每new一个新的cat对象,总能在堆中找到相对应的成员变量id。
而对于static变量sid来说,不论是否new了Cat类的对象,或是new了多个Cat类的对象,sid变量都只有一份,并且存放在data segment区中,也就是说sid是静态的,固定的,而不是依赖于对象而存在的,static变量并不需要借助new关键字动态地为其进行内存分配。
注释:data segment区用于存放静态变量、字符串常量。
static变量是属于整个类的,类的任何对象都可以访问这个变量,它不单独地属于某一个对象。
如何访问static变量?
1. 任何cat对象都可以直接访问sid,访问的都是同一块内存区域。
2. 如果没有对象,直接通过类名.staic变量名的方式也可以访问,即:Cat.sid
平时常见的有:System.out、System.in
二、静态方法
用static声明的方法为静态方法,static方法可以直接调用,不需要通过引用.方法名的方法来调用。static方法在访问一个成员变量之前,必须先new一个对象,这是因为成员变量只有new了对象才能存在。
如下面的例子就是错的:
class Cat {
int id;
public static void main(String[] args) {
id = 10;
}
}
看上去id的作用域包括了main,但因为main是静态的,所以
必须先new对象,如果直接访问普通的成员变量就会出错。这是为什么呢?
由于static方法可以被直接调用而不必先new对象,再被调用,因此static方法在访问普通成员变量之前必须先new对象,而非static方法(即普通方法)可以直接访问成员变量是因为普通方法被调用的前提是已经有了对象(对象名.方法名才能调用该方法 ),因此普通方法中可以直接使用未new的对象的成员变量而不会报错。下面的才正确:
class Cat {
int id;
public static void main(String[] args) {
Cat cat = new Cat();
cat.id = 10;
}
}