static关键字
在我们开始研究一个事物的时候,我们首先要问一句,为什么?
所以,为什么要有static关键字呢?
如果,我们把中国人抽象为java的一个类,那么这个类中就必然存在一些成员属性。假定中国人这个类中有国籍,身份证号码。我们都知道每个人的身份证都不同,但是我们每个中国人的国籍都相同,都是中国
附上代码
public class Chinese{
private int id ;
private String conturyName ;
}
每当我们通过 new 关键字,先后在JVM的堆内存空间和栈内存空间(读到方法时,入栈)开辟一个空间时,我们都要对这个对象进行赋值操作。
我们创建了张三这个对象实例之后进行赋值(111,“China”)
创建了李四赋值为(222,“China”)
附上代码
public class Chinese{
private int id ;
private String conturyName ;
public void setId(int cid){
id = cid ;
}
public int getId(){
return id;
}
public void setName(String name ){
conturyName = name ;
}
public String getName(){
return conturyName ;
}
}
public class ChineseTest{
public static void main(String []args){
Chinese zs = new Chinese();
zs.setId(111);
System.out.println(zs.getId());
zs.setName("China");
System.out.println(zs.getName());
System.out.println("-------------------");
Chinese ls = new Chinese();
ls.setId(222);
System.out.println(ls.getId());
ls.setName("China");
System.out.println(ls.getName());
}
}
运行截图
那我们如果要将1w个的中国人的身份证和国籍输入到系统中,那我们就需要进行“China”(这个每个对象具有相同值的)1万次的赋值操作。这样很浪费空间,加大了内存的开销。
所以,既然中国人的国籍都是“China”,那为什么不独立出来共同使用呢?这样我们就不需要进行重复的赋值操作了。
此时,static便应运而生了
那么static产生的变量将会存放在哪呢?
我们知道JVM主要有三大内存空间
栈内存空间、堆内存空间、方法区内存空间
static关键字产生的变量叫static变量,与局部变量和成员变量不一致。
静态变量不存放与堆内存空间中(局部变量),也不存放于栈内存空间中(成员变量),因此只存在于方法区内存空间中
图示表示为
内存空间 | 存放变量 |
---|---|
栈内存空间 | 局部变量 |
堆内存空间 | 成员变量 |
方法区内存空间 | 静态变量 |
方法区内存
方法区内存主要存放
代码片段的字节码文件(.class)、静态的数据和常量
是JVM种最先加载的一块内存空间(甚至先于main()方法执行)
在加载的过程中,遇到静态的变量,就会将在这个空间中开辟空间存储并赋值
这无疑大幅度的减少了内存的开销,并提高了程序运行的效率
既然如此,那我们什么时候可以使用static呢?
只有当该类中每一个对象都具有相同值的时候才能使用,也就是说这是属于类级别的变量(与之对应的是成员变量),其引用方法为“类名.”来访问(适用于静态的变量或者方法)
this关键字
this 意为 这个
同样的,我们需要问一下
为什么要有this关键字?
在解释之前,我们来看一段代码
public class This{
private int id ;
public This(int id){
id = id ;
}
public String toString(){
return "{" + id + "}" ;
}
}
public class ThisTest{
public static void main(String []args){
This t = new This(1);
System.out.println(t);
}
}
运行结果
分析:
我们在ThisTest类中明明给id赋值为1,可是结果却是0,为什么?
这就涉及到java中的就近原则,也就是说
public This(int id){
id = id ;
}
这个等号左边的id为形参中的id
等号右边id 也为形参中的id
也就是说,我们并没有更改这个This类中的id的值!!!
而当我们用上this关键字时
public This(int id){
this.id = id ;
}
结果变成了我们想要的“1”。
此时:
等号左边的this.id为构造方法中传入的id
等号右边的id 为 This类中的成员属性id