关于Java中static和this关键字

深入探究static与this

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

猜你喜欢

转载自blog.csdn.net/qq_22841387/article/details/113149147