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

被折叠的 条评论
为什么被折叠?



