含泪咬牙学习的第七天
今天总结static关键字,个人认为还是比较重要
static关键字
用于修饰成员(成员变量和成员函数)
特点
- 随着类的加载而加载
- 优先于对象存在
- 被所有对象所共享
- 可以直接被类名调用
注意
- 静态方法只能访问静态成员
- 静态方法中不可以写this / super 关键字
- 主函数是静态的
- 非静态成员既可以访问非静态成员也可以访问静态成员(例:就像下列代码中show()方法就不能被static所修饰,因为输出语句中的name和age包含this关键字)
内存运行图
图解:
- 在main函数进栈前代码区和静态代码区就已经存在
- 然后main函数进栈,实例化对象s1
- s1指向堆里的一部分空间,存放了类中的name和age,并且可以指向静态代码区
- s1.show()方法进栈执行,
- 执行完毕弹栈
- 实例化对象s2
- 与s1相同,s2指向堆里另一部分空间,并且,s2可以指向同一静态代码区
- s2.show()方法进栈执行,
- 执行完毕弹栈
- 10.main函数执行完毕弹栈
静态方法的调用还可以直接类名加属性名,不用再通过对象
class Student{
static string school="CSDN"; //被static所修饰 静态变量
int age;
string name; //成员变量
Student(string name,int age)
{
this.name=name;
this.age=age;
}
public void show(){
System.out.println(name+",来自"+school+","+age+"岁");
}
}
public class DemoStudent{
public static void main(String[] args)
{
Student s1=new Student("zs",20);
s1.show();
Student s2=new Student("ls",21);
s2.show();
System.out.println(s1.shool); //对象 访问方式
System.out.println(Student.shool); //类名 访问方式
}
}
成员变量与静态变量的区别
1.存储位置不同
- 成员变量 在堆内存中存储(对象有特有的数据)
- 静态变量 在静态静态代码区存储(所有对象共享数据)
2.调用方式不同
- 成员变量 通过对象来调用
- 静态变量 可以通过对象,也可以通过类名来调用
3.生命周期不同
- 成员变量 随对象的产生而产生,随对象消失而消失
- 静态变量 随类的产生而产生,随类的消失而消失
4.别名不同
- 成员变量 --实例变量
- 静态变量 --类变量