static关键字学习笔记
static修饰属性
public class Demo07 {
public static void main(String[] args) {
Student s = new Student();
System.out.println(s.num);
System.out.println(Student.age);
}
}
class Student{
//在线程中使用比较常用
public static int age; //静态的变量
public int num; //非静态的变量
}
- 被static修饰的属性叫类属性(静态变量)—可以直接使用 类名.属性名 的方式调用类中的属性;没有static修饰的属性叫对象属性(非静态变量)— 必须通过创建对象之后才能调用。
//static关键字
public class Demo07 {
public static void main(String[] args) {
Student s1 = new Student();
System.out.println(s1.age); //输出s1中的age值
System.out.println(s1.num); //输出s1中的num值
System.out.println("----------------------");
Student s2 = new Student();
System.out.println(s2.age);//输出s2中的age值
System.out.println(s2.num);//输出s2中的num值
System.out.println("----------------------");
//修改s2的age与num值
s2.age = 20;
s2.num = 2;
//输出s1,s2中的age值
System.out.println("s1的age值 :"+s1.age);
System.out.println("s2的age值 :"+s2.age);
System.out.println("----------------------");
//输出num值
System.out.println("s1的num值 :"+s1.num);
System.out.println("s2的num值 :"+s2.num);
}
}
class Student{
public static int age = 10; //静态的变量
public int num = 1; //非静态的变量
}
输出结果:
10
1
----------------------
10
1
----------------------
s1的age值 :20
s2的age值 :20
----------------------
s1的num值 :1
s2的num值 :2
- 静态的变量是共享的,属于当前类,所以静态变量也叫类变量,该类的所有对象共同使用这一个变量。而非静态变量是每个对象私有的、不共享的,修改一个对象的非静态变量不会影响其它对象。
static修饰方法
public class Demo07 {
public static void main(String[] args) {
Student s = new Student();
s.walk();//调用非静态方法
Student.run();//调用静态方法
}
}
class Student{
public static int age; //静态的变量
public int num; //非静态的变量
public static void run(){
System.out.println("跑。。。");
System.out.println(age); //访问静态变量
jump(); //调用其他的静态方法
}
public static void jump(){
System.out.println("跳。。。");
}
public void walk(){
System.out.println("走。。。");
}
}
- 静态的方法可以使用类名.方法名实现调用
- 静态的方法可以调用静态的属性,但不能调用非静态的属性。非静态方法可以调用所有属性
- 在同一个类中,静态的方法之间可以互相调用,非静态的方法可以调用静态的方法,但静态的方法不能调用非静态方法。
static修饰代码块
public class Demo08 {
public static void main(String[] args) {
Student1 s1 = new Student1();
System.out.println("-----------------------");
Student1 s2 = new Student1();
}
}
class Student1 {
{
System.out.println("调用匿名代码块");
}
public Student1() {
System.out.println("调用无参的构造方法");
}
static {
System.out.println("调用静态代码块");
}
}
输出结果:
调用静态代码块
调用匿名代码块
调用无参的构造方法
-----------------------
调用匿名代码块
调用无参的构造方法
由上面可以得出下结论:
- 当创建对象时,先运行静态代码块,再运行匿名代码块,最后才运行构造方法
- 静态代码块在第一次创建对象的时候运行,只运行一次。
- 代码块运行的顺序与位置无关。
拓展(了解)
static关键字还可以在导包的时候使用(不常用),导入工具类中具体的一个方法。
package cn.jd.base1;
import static java.lang.Math.random;
import static java.lang.Math.PI;
public class Demo09 {
public static void main(String[] args) {
System.out.println(random());
System.out.println(PI);
}
}
这样就可以直接写random()而不使用Math.random()来调用方法。