static | B站Java学习笔记

博客围绕Java中变量展开,探讨实例变量和静态变量的声明时机。以“中国人”类为例,分析两种变量的内存图,指出实例变量会因对象多次出现而浪费内存,静态变量在类加载时初始化,存储在方法区,还提及空引用访问静态变量等内容。

static: 静态的

1. 所有static关键字修饰的都是类相关的,类级别的
2. 所有static修饰的,都是采用"类名."的方式访问
3. static修饰的变量:静态变量
4. static修饰的方法:静态方法

(博主的小理解,之所以称作为静态,是因为针对类级别的话,不会根据具体的不同的对象变化而变化,如有理解不对,请指出 ^^)

变量的分类:

变量根据声明的位置进行划分:
	在方法体当中声明的变量:局部变量
	在方法体外声明的变量:成员变量

成员变量又可以分为:
	实例变量
	静态变量
class VarTest {
	//以下实例的,都是对象相关的,需要先new对象
	//可能会出现空指针异常
	int i; // 成员变量中的实例变量
	public void m2() {
		int x = 200; //局部变量
	} // 实例方法

	//以下静态的,不需要new对象,都是类相关
	//不需要对象的参与即可访问,没有空指针异常的发生
	static int k; // 成员变量中的静态变量
	public static void m1() {
		int m = 100; //局部变量
	} // 静态方法


什么时候变量声明为实例的?什么时候声明为静态的?
定义一个类:中国人

class Chinese {
	String idCard; //身份证号,每个人的身份证号不同,所以这个应该是实例变量,一个对象一份
	String name; //同理,姓名也是,实例变量
	static String country; //国籍,这个类本身就是中国人,不会随着对象的改变而改变,显然国籍并不是对象级别的特征,属于整个类的特征

	public Chinese() {
	}
	public Chinese(String s1, String s2, String s3) {
		idCard = s1;
		name = s2;
		country = s3;
}
public class StaticTest02 {
	public static void main(String[] args) {
		Chinese c1 = new Chinese("123456","张三","中国");
		Chinese c2 = new Chinese("234567","李四","中国");
	
	}
}

(注意:只要是方法,不管是静态方法,实例方法,构造方法,它们在运行的时候都需要压栈,只不过对于构造方法来说,new完一个对象,就弹出去了

假设声明为实例变量,内存图是怎样的?String country;
假设声明为静态变量,内存图又是怎样的? static String country;

实例变量 --> 对于Chinese这个类来说,堆内存里面,有多少对象,country就会跟着出现多少次,会浪费内存,因为显然“国籍,中国人”是整个类的特征

静态变量 --> static String country; 在类加载时就初始化了,不需要new对象,静态变量的空间就开出来了,并且储存在方法区。
一般静态变量会给个值,因为固定不变,这个例子就是static String country = "中国";


Java 储存 (Java一共有三个变量)

栈:局部变量
堆:实例变量 (对象级别)
方法区:静态变量 (类级别)

什么时候变量声明为实例的?什么时候声明为静态的?

如果这个类型的所有对象的某个属性值都是一样的,
不建议定义为实例变量,浪费内存空间。
建议定义为类级别特征,定义为静态变量,在方法去中只保留一份,节省内存开销

一个对象一份的是实例变量。
所有对象一份的是静态变量。

空引用访问静态变量

class Chinese {
	int idCard;
	String name;
	static String country = "中国";
	public Chinese (String x, String y) {
		idCard = x;
		name = y;
	}
}
public class StaticTest03 {
	public static void main(String[] args) {
		System.out.println(Chinese.country); //通过"类名."的方式访问静态变量
		Chinese c1 = new Chinese("111111", "张三");
		
		//那么静态的country,可以用c1来访问吗?是可以的
		System.out.println(c1.country);
		
		c1 = null; // c1现在是空引用
		//分析这里会不会出现空指针异常?
		//不会出现空指针异常
		//因为静态变量不需要对象的存在
		//实际上以下的代码在运行的时候,还是:System.out.println(Chinese.country)
		System.out.println(c1.country);

		System.out.println(c1.name);//这个会出现空指针异常	
	}
}

总结:

实例的:一定需要使用"引用."来访问
静态的:建议使用"类名.” 来访问,但使用"引用."也行
静态的如果使用"引用."来访问会让程序员产生困惑,程序员会以为是实例的

空指针异常只有在什么情况下才会发生呢?
回答:只有在“空引用”访问实例相关的,都会出现空指针异常

仅供学习使用,内容版权归B站老师所有。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值