我们一般想要调用某个类中的属性或者行为(方法),就需要创建一个类的对象才能去做这个事情。
static修饰变量
class Chinese{
String name;
int age;
}
public static void main(String[] args) {
Chinese c1 = new Chinese();
c1.name = "姚明";
c1.age = 40;
Chinese c2 = new Chinese();
c2.name = "马龙";
c2.age = 30;
}
比如我们创建的这类,对象c1和c2分别占两块不同的内存空间,这两个对象中的属性虽然是一样的,但是互不相干。假如我们修改其中一个对象的属性,另一个对象中的属性是不会发生改变的。
但是我们有的时候希望无论是否产生了对象或者说无论产生了多少对象的情况下,某些特定的数据在内存空间里只有一份。比如说每一个中国人他的国家都是中国,也就是说所有的中国人都共享中国这个国家的名称,所以不必在每一个中国人的实例对象中都单独分配一个用于代表国家名称的变量。要想实现这个事儿,就要引出static关键字了。
我们在之前创建的类中新加入一个属性,并用static关键字修饰。
public static void main(String[] args) {
Chinese c1 = new Chinese();
c1.name = "姚明";
c1.age = 40;
c1.nation = "中国";
Chinese c2 = new Chinese();
c2.name = "马龙";
c2.age = 30;
System.out.println(c2.nation);
}
}
class Chinese{
String name;
int age;
static String nation;
}
从代码中可以清楚的看见,我们只对c1对象的nation属性赋值并没有对c2对象的nation属性赋值,按之前的情况来看,应该输出为空,但是结果是中国,即nation这个属性在被多个对象共享。使用static关键字修饰的变量我们叫做静态变量。
那反之不会发生改变的属性我们叫做非静态变量,也就是我们平常说的实例变量。
再举一个例子理解静态变量,比如我两个月之前刚来北京工作要租房子,那么租一整套肯定是租不起的,所以和几个朋友合租,一间一间的那种,那么每一个房间就相当于一个对象,里面可能会有床、书桌、柜子等等这些,那么这些就相当于实例变量,我把我房间里的桌子砸了但是别人房间里的桌子并不会坏,那么对于卫生间里马桶,如果我把它砸了,我几个朋友也用不了了,那这就是静态变量, 对于这个马桶,它是属于这套房子的,所以静态变量也叫作类变量。
说明:
1.静态变量随着类的加载而加载,可以通过类.静态变量进行调用
2.静态变量的加载要早于对象的创建
3.由于类只会在加载一次,则静态变量在内存中也只会存在一份,存在于方法区中的静态域中
static修饰方法
有了上面对静态变量的理解,理解静态方法就容易一些。顾名思义,被static修饰的方法叫做静态方法。那它也是随着类的加载而加载,我们可以不通过创建对象去调用这个方法。
public static void main(String[] args) {
Chinese.eat();
}
class Chinese{
public static void eat(){
System.out.println("I can eat");
}
}
说明:
1.静态方法中,只能调用静态的方法或属性
2.非静态方法中,姐可以调用静态的方法或属性,还可以调用非静态的方法或属性
注意点:
在静态的方法中,不能使用this、super关键字
关于static修饰代码块、类,这里先不做概述,最后一点,我们学习了static关键字,那么在真实开发中,如何确定一个方法是否要声明为static的?这是一个很重要的问题,如果不会用,那么白学了。
对于属性,如果这个属性是可以被多个对象所共享的,不会随着对象的不同而不同的,那么一般要加static关键字修饰。
如果大家觉得抽象,我再举一个例子,比如我们每一个人或多或少都会有银行卡,那么银行他是有最少存储金额,比如5元,再比如利率,对于办理这家银行银行卡的所有人,这些属性都是一样,所以要加上static关键字。
对于方法,操作静态属性的方法,通常设置为static。包括工具类中提取出来的方法,一般也都要加上static关键字。