Java static

写在开头

 static作为静态成员变量和成员函数的修饰符,意味着它为该类的所有实例所共享
 也就是说当某个类的实例修改了该静态成员变量,其修改值为该类的其它所有实例所见。
 静态存在与方法区中
 今天我们说一下Java:静态

静态概述

  1. static :静态的,具有共享性
  2. 静态跟随着类(class)的加载而加载进内存,(类进入到内存的时机: 调用了类中main方法,实例化对象,调用类中静态,继承关系,如果你要使用这个类中的内容,那么类就需要先加载进内存) 类进内存后,JVM就会检索,类中有哪些使用static修饰的成员(成员变量,方法),将static修饰的成员加载进入到内存区域中(数据共享,静态池)
  3. static静态属于类的,不属于任何对象;但是可以被这个类的所有对象所使用(共享性)
  4. static静态优先于对象存在
  5. 静态的调用方式:类名.静态

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 静态关键字 static
public class StudentStaticDemo
{
String name;
int age;
// 共享的变量,使用静态修饰的变量,属于类
static String schoolName = "清华大学";

public static void main(String[] args)
{
StudentStaticDemo ss = new StudentStaticDemo();
System.out.println(ss.schoolName);//清华大学
ss.schoolName = "北京大学";// 赋值

StudentStaticDemo ss1 = new StudentStaticDemo();
System.out.println(ss1.schoolName);//北京大学

// 静态的调用方式: 最推荐 类名.静态------ 成员变量,静态方法
// 静态的调用方式2中 1) 最推荐 2) 可以通过对象名.调用 (不推荐)
// 静态属于类的,可以被所有对象共享使用,
System.out.println(StudentStaticDemo.schoolName);//北京大学
}
}

使用时注意事项

静态中(方法)不能调用非静态(变量,方法)

  1. 静态都使用static修饰
  2. 静态方法中,不能调用非静态的变量
  3. 静态方法中,不能调非静态的方法
  4. 静态中不能使用this关键字
  5. 非静态中可以使用静态

静态使用静态

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 静态调用的注意事项,静态不能调用非静态
public class StaticZhuYiDemo
{
int a = 10;//成员变量,非静态
static int b = 10;// 成员变量,静态

public static void main(String[] args)
{
// System.out.println(this); 错误代码,static中不能使用this关键字
//get(); 错误代码,静态中不能直接调用非静态的方法,可以通过new对象调用非静态方法
StaticZhuYiDemo sz = new StaticZhuYiDemo();
sz.get();

//System.out.println(a);// 错误代码,无法从静态的上下文中,调用非静态的变量a
System.out.println(b);// 静态变量可以在静态方法中使用
}

public void get(){// get方法为非静态方法
System.out.println("----");
}
}

静态和非静态的区别

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

1. 所属不同
静态变量: 属于类
非静态变量: 属于对象
2. 内存存储位置不一样
静态变量: 存在于数据共享区域(静态池)
非静态变量 : 存在于堆内存中
3. 生命周期不同
静态: 属于类,随着类进入到内存,静态出生;类不再使用了,类出内存,静态消亡
非静态变量: 属于对象,随着对象的创建(new)进入内存;当对象在栈内存中,没有任何的引用再指向这个变量时,对象变成垃圾,等着回收,非静态变量分着对象消亡
静态的生命周期大于非静态的生命周期
4. 调用方式不同
静态: 1) 类名.静态 2) 创建对象,通过对象名.静态------(不推荐使用)
非静态: 创建对象,通过对象名.非静态
5. 静态的成员变量,在进入到数据共享区域时,JVM也会给静态成员赋初值

晚安

 今天就到这里了,明天见,加油!

-------------本文结束感谢您的阅读-------------
0%