【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
**开源地址:https://docs.qq.com/doc/DSmxTbFJ1cmN1R2dB **
}
}
class Chinese {
// 姓名; 实例变量
String name;
//身份证号; 实例变量
String idNum;
//国籍; 实例变量
String nation;
//无参构造器
public Chinese() {}
//有参构造器
public Chinese(String myName, String myIdNum, String myNation) {
this.name = myName;
this.idNum = myIdNum;
this.nation = myNation;
}
}
输出结果:
姓名:张三 身份证号:333333333333 国籍:中国
姓名:李四 身份证号:444444444444 国籍:中国
可以看出来,这个Chinese类抽象的是中国人,所以这里面”国籍“实例变量就可以声明为静态变量,让国籍固定为chinese;
访问时只需要用Chinese类来访问就可以了;
代码如下:
public class StaticTest02 {
public static void main(String[] args) {
Chinese c1 = new Chinese(“张三”, “333333333333”);
System.out.print(“姓名:” + c1.name);
System.out.print(" 身份证号:" + c1.idNum);
// 静态变量不需要实例化,只需要用类来访问就可以了
System.out.println(" 国籍:" + Chinese.nation);
Chinese c2 = new Chinese(“李四”, “444444444444”);
System.out.print(“姓名:” + c2.name);
System.out.print(" 身份证号:" + c2.idNum);
System.out.println(" 国籍:" + Chinese.nation);
}
}
class Chinese {
// 姓名; 实例变量
String name;
//身份证号; 实例变量
String idNum;
//国籍; 静态变量
static String nation = “中国”;
//无参构造器
public Chinese() {}
//有参构造器
public Chinese(String myName, String myIdNum) {
this.name = myName;
this.idNum = myIdNum;
}
}
输出结果:
姓名:张三 身份证号:333333333333 国籍:中国
姓名:李四 身份证号:444444444444 国籍:中国
可以看到输出结果都是一样的,这时候应该会有一个疑问:既然输出结果都一样,那么用静态变量有什么用呢?
这就涉及到底层的内存了,简单说一下,实例变量都存放在堆中,每一个实例变量都会占有一定的内存空间,像”国籍“这个实例变量同样每声明一个对象就会多占用一块空间,而静态变量存放在方法区中,而且只需要声明一次,这个类就可以一直用;
所以,如果这个类的所有对象的属性值都是一样的,不建议定义为实例变量,会浪费内存空间;
建议定义为静态变量,在方法区中只保留一份,节省内存的开销;
小总结
对于静态变量,
**对象级别的变量不需要static
类级别的变量需要static**
对象级别:一个对象对应一份数据,各个对象都可以不同
类级别: 所有对象对应一份数据,各个对象都一样
静态变量可以使用引用去访问,但实际上在执行过程中,引用所指向的对象并没有参与,如果是空引用访问实例变量,程序一定会发生空指针异常,但是如果用空引用访问静态变量,程序并没有发生空指针异常,所以通过引用访问静态变量实际上还是直接通过类去访问的
测试代码:
public class StaticTest03 {
public static void main(String[] args) {
Chinese c = new Chinese(“张三”, “3333333333”);
System.out.print(“姓名:” + c.name);
System.out.print(" 身份证号:" + c.idNum);