目录
不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
介绍static
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的
简单来说:在某些类的对象中存在一些相同的成员变量,那么这种成员变量就可以设置成static修饰的成员变量,当然这只是一种相对简单的介绍。
静态成员变量的特性
1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
3. 类变量存储在方法区当中
4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
详解static修饰的成员变量
注意:由于类最好是单独存放一个java文件,本文为了方便展示把类定义在了一个java文件里
不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?答案是不行的。
因为假设班级是String类型,如果把班级设置成普通的成员变量在没实例化“班级”成员之前里面存放的是null,而我们设置一个这种变量,且都是一个班级,参数都是相同的,就必须每new一个新对象就得实例化这个相同的参数,显得很繁琐冗余
那么把这个“班级”设置成static修饰的成员变量就不会有这样的麻烦,因为他是静态的,且与对象无关,每new一个新对象那么就会先赋予这个参数
例如:static String CS = "1班";
那么每次new一个对象就不需要实例化它,该对象CS成员会在第一次创建该类的对象时被实例化为“1班”;
为什么说static修饰的成员变量与对象无关,不属于对象
原因很简单:
被static修饰的成员变量与对象的构造无关,它是放在方法区的,而对象是放在堆区的
看代码:
class Student{
public String name;
public int age;
public static String CS = "1班";
}
public class Test {
public static void main(String[] args) {
System.out.println(Student.CS);
}
}
结果:
注意:我并没有创建一个Student对象,而是直接Student.CS把CS打印出来了 ,并且在后面这张图片中我new了一个对象,但是对象中只有name和age两个成员变量
结论:static修饰的成员变量并不属于对象
生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
上面我没有创建对象直接用Student(类名)来访问类中的CS静态成员变量就能很好的说明这点,静态成员变量在访问类的时候就已经存在且被赋值了,且只执行一次,所以该变量才会是被共享的,所有对象都是的这个变量都是一样的值,
和类绑定自然而然就是类被加载是就创建好了,类没了这个变量也就没了
class Student{
public String name;
public int age;
public static String CS = "1班";
Student(String name,int age){
this.name = name;
this.age = age;
}
}
public class Test {
public static void main(String[] args) {
Student stu = new Student("张伟",18);
Student stu1 = new Student("张三",18);
System.out.println(stu.name + "CS="+Student.CS);
System.out.println(stu1.name + "CS="+Student.CS);
}
}
结果:CS是一个全局的成员变量
static修饰成员方法
既然static修饰的成员变量不属于对象
那static属性应该如何访问呢?
答案是:使用static修饰的成员方法来
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的
比如说:
public static String getCS(){
return CS;
}
static修饰的getCS方法就能很好的访问到类中的静态成员变量CS,并且提取数据
静态方法的特性
1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
(和前面的静态成员变量的特性差不多)
为什么不能在静态方法中访问任何非静态成员变量
我们知道:在创建一个对象之后,是通过对象的引用(this)去访问对象的普通成员,
而静态方法也是放在方法区的,且非静态方法有this参数,在静态方法中调用时候无法传递this引用
static成员变量初始化
1.直接初始化
2.通过静态代码块初始化
需要更改变量值可以:通过静态方法更改static成员变量的值
1.直接初始化
就是在创建静态变量时就初始化
static String CS = "1班";
2.通过静态代码块来初始化
static String CS;
static{
CS = "2班";
}
3.通过静态方法更改static成员变量的值
pubilc static void setCS(String CS){
Student.CS = CS;
}
本篇就分享都这里了,各位看官老爷给个三连支持一下吧!!!