static关键字
——————————————————————————————————————————
使用范围:在Java类中,可用static修饰属性、方法、代码块、内部类。
被修饰后的成员具备以下特点:
1 随着类的加载而加载
2 优先于对象存在
3 修饰的成员,被所有对象所共享
4 访问权限允许时,可不创建对象,直接被类调用
static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构。
static修饰的方法不能被重写
因为不需要任何实例就可以访问static方法,所以static方法内部不能有this和super (被静态所修饰的方法可以被其他方法直接调用,而被静态所修饰的方法不能直接调用非静态方法 )
可以把被静态所修饰的东西就是一个已经在厨房准备好的原料,而非静态的东西就是还没买回来的原料,静态方法不能直接调用非静态方法正如你已经在厨房准备好的原料不能等那些还没买回来的原料再一起烹饪,而非静态方法可以直接调用静态方法正如我把没买回来的原料买回来了,我自然可以把它和已经在厨房准备好的原料一起烹饪。
————————————————————————————————————————————
下面是一个代码例子
public class Demo {
public static void main(String[] args) {
Chinese.nation = "中国";
Chinese c1 = new Chinese();
c1.name = "姚明";
c1.age = 40;
c1.nation = "CHN";
Chinese c2 = new Chinese();
c2.name = "马龙";
c2.age = 30;
c1.nation = "CHINA";
System.out.println(c1.nation);
System.out.println(c2.nation);
}
}
class Chinese{
String name;
int age;
static String nation;
}
这个代码输出结果无论是 c1.nation 还是 c2.nation 都是 CHINA,这是因为静态属性 nation 存在于内存的方法区中,每一次赋值给nation新的值就会覆盖掉旧的值,我用如上面代码举例 nation 值的变化过程 :nation : null ——> 中国——> CHN ——>CHINA,所以无论你是用c1还是c2调用静态属性 nation 输出的结果都是最后的CHINA。
而name age这两个非静态属性的存在,则由在栈中的c1和c2这两个对象引用分别指向堆中的两个区域。所以不会像静态方法那样被覆盖。
本人初学小白,如有错误请指出让我更正~