概述
static是静态的意思,我的理解就是在一个类中创建一个变量或者方法,而这个变量或者方法是属于公共的可以直接通过这个类访问这个变量或者这个方法。
访问的方式
类名.static的变量名
类名.static的方法名
static变量
这里我写了一个小demo用来调用static变量的
创建一个B的测试类
public class B {
public static void main(String[] args) {
A a = new A();
A a1 = new A();
A.setTeacher("张莹");
a.daYin();
a1.daYin();
}
创建了一个标准的A的javabean类
public class A {
private int a;
private static String teacher;
public void daYin (){
System.out.println(teacher);
}
public A() {
}
public A(int a) {
this.a = a;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public static String getTeacher() {
return teacher;
}
public static void setTeacher(String teacher) {
A.teacher = teacher;
}
}
这里分析了一下static中的内存图
执行main方法中的静态变量teacherName时先会加载Student这个类的字节码文件,然后再再静态区中存储静态变量teacherName由于是String类型所以初始值是null。
接着给teacherName赋值
然后newStudent对象在堆空间开辟一个空间并给予地址值在把地址值赋值给s1,然后初始化name和age,然后给name和age赋值。
然后调用show方法。show方法进栈,并执行里面的打印函数。
执行完show方法,show方法出栈,然后在new了一个Student,也是在堆里面开辟了一个空间并给了一个地址值,然后把地址值给s2,然后变量初始化,但是这里没有给里面的赋值。所以打印的就是null 0 阿伟老师
static方法
static的注意事项
我在这里用自己的理解解释一下,因为静态变量是属于类的并不是某个对象的,所以它不能访问非静态的变量和方法,因为它的创建是比较对象还要早的,那静态方法中没有this是因为this是谁调用这个方法那个对象就把地址值给this,而静态方法的 直接通过类调用的,没有对象所以就没有this
小结
1.当 static
修饰成员变量或者成员方法时,该变量称为静态变量,该方法称为静态方法。该类的每个对象都共享同一个类的静态变量和静态方法。任何对象都可以更改该静态变量的值或者访问静态方法。但是不推荐这种方式去访问。因为静态变量或者静态方法直接通过类名访问即可,完全没有必要用对象去访问。
2.无static修饰的成员变量或者成员方法,称为实例变量,实例方法,实例变量和实例方法必须创建类的对象,然后通过对象来访问。
3.static修饰的成员属于类,会存储在静态区,是随着类的加载而加载的,且只加载一次,所以只有一份,节省内存。存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。它优先于对象存在,所以,可以被所有对象共享。
4.无static修饰的成员,是属于对象,对象有多少个,他们就会出现多少份。所以必须由对象调用。