static
1修饰的变量,称为静态变量 或类变量,类属性
(只能修饰成员变量,不能修饰局部变量,报错!!)
*他作为该类的公用变量,属于类,被该类中所有的实例共享,在类被载入时被显式初始化,
*对于该类的所有对象来讲,static成员变量只有一份,被该类所有对象共享!!
*可以使用"对象.类属性" 调用,但一般建议使用"类名.类属性"
*static变量置于方法区中
2修饰的方法称为静态方法 或类方法
*不需要对象,就可调用方法(类名.方法名)
*在调用该方法时,不会将对象的引用传递给他,所以在static 方法中不可访问非static的成员
*静态方法中不能以任何方式引用this和super关键字
3修饰的代码块 称为 静态代码块
4修饰的类 称为 静态内部类
内存分析:
*栈: 存放 局部变量 先进后出,自下而上存储 方法执行完毕,自动释放空间
*堆: 存放new出来的对象,需要垃圾回收器来回收(GC)
*方法区: 存放 类的信息(代码), static 变量, 字符串常量等
创建Student类
public class Student {
String name;
int age;
char gender;
static String school; //静态变量,被所有对象共享,存在于方法区中的static变量区,比其他三个成员变量,创建多个对象时,更省空间
//构造方法: 创建对象,初始化对象
public Student() {
}
//3个参数的构造器
public Student(String name,int age,char gender) {
this.name=name;
this.age=age;
this.gender=gender;
}
//四个参数的构造器
public Student(String name,int age,char gender,String school) {
this(name,age,gender);
this.school= school;
}
/**普通方法与静态方法的比较
* 1.普通方法中可以使用静态变量
* 2.static 方法中不可访问非static的成员,编译报错
*/
public void show() {
System.out.println(name+"\t"+age+"\t"+gender+"\t"+school);
}
public static void show1() {
System.out.println(name+"\t"+age+"\t"+gender+"\t"+school); //编译报错, 加载静态方法时,非静态方法尚未存在,文章最后程序
}
}
创建测试类
public class Test {
public static void main(String[] args) {
Student s1 = new Student("李丽丽", 18, '女', "北京大学");
Student s2 = new Student("王哈哈", 19, '女'); //没有初始化学校名称
System.out.println(s2.name+"的学校是"+s2.school);//s2 共享了静态变量school,建议使用"Student.school"
System.out.println(Student.school);
}
}
程序执行过程:
1.将"类的信息"加载到内存
2.将static属性和方法加载到内存school, show1()
3.JVM执行main方法
4.创建Student类型对象s1, s2,在堆中开辟空间,变量name=null age=0 gender=null 产生
5.执行show() 方法