static关键字概述:
在Java中,定义static关键字用于修饰类的成员,
如成员变量、成员方法以及代码块等,被static修改的成员具备些特殊性。
static关键字使用范围:
在Java类中,可用static修饰属性、方法、代码块、内部类。
被static关键字修饰后的成员特点:
1.随着类的加载而加载。
2.优先于对象存在。
3.修饰的成员,被所有对象所共享。
4.访问权限允许时,可不创建对象,直接被类调用。
静态变量:
1.在Java类中,可以使用static关键字来修饰成员变量,该变最被称作静态变量。
2.静态变量被所有实例共享,可以使用“类名.变量名”的形式来访问。
3. static 关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。
1 class Student {
2 //定义静态变量schoolName
3 static String schoolName;
4 }
5
6 public class StaticDemo{
7 public static void main(String[] args) {
8 //创建学生对象
9 Student stu = new Student();
10 Student.schoolName = "MIT"; //为静态变量赋值
11 System.out.println("我的学校是" + Student.schoolName);
12 }
13 }
静态方法:
1.在类中使用static修饰的静态方法会随着类的定义而被分配和装载入内存中。
2.非静态方法属于对象的具体实例,只有在类的对象创建时在对象的内存中才有这个方法的代码段。
3.引用静态方法时,可以用类名.方法名或者对象名.方法名的形式
注意事项:
1.非静态方法既可以访问静态数据成员 又可以访问非静态数据成员,
而静态方法只能访问静态数据成员。
2.非静态方法既可以访问静态方法又可以访问非静态方法,
而静态方法只能访问静态数据方法。
原因分析:
1.静态方法和静态数据成员会随着类的定义而被分配和装载入内存中。
2.非静态方法和非静态数据成员只有在类的对象创建时,
在对象的内存中才有这个方法的代码段。
1 public class TestStatic {
2 public static void main(String[]args){
3 //使用类名加前缀访问静态方法
4 System.out.println(S.getStatic());
5 S s=new S();
6 //使用实例化对象名访问静态方法
7 System.out.println(s.getStatic());
8 System.out.println(s.get());
9 }
10 public static class S
11 {
12 private static int a;
13 private int t=0;
14
15 //静态初始器:由static和{}组成,只在类装载的时候
16 // (第一次使用类的时候)执行一次,往往用来初始化静态变量。
17 static{
18 a=10;
19 }
20
21 //静态方法只能访问静态数据成员
22 public static int getStatic() { return a;}
23 public int getT(){return t; }
24
25 //非静态方法可以访问静态方法和非静态方法
26 public int get(){
27 getT();
28 getStatic();
29 t=a;//非静态方法可以访问非静态数据成员和静态数据成员
30 return t;
31 }
32 }
33 }
静态代码块:
1.在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,
用static关键字修饰的代码块称为静态代码块。
2.当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。
在程序中,通常会使用静态代码块来对类的成员变量进行初始化。
1 class staticDemo{
2 //静志代码块
3 static {
4 System.out.println("测试类的静态代码块执行了");
5 }
6
7 public static void main(String[] args) {
8 //下面的代码创建了两个Person对象
9 Person p1 = new Person() ;
10 Person p2 = new Person();
11 }
12 }
13
14
15 class Person{
16 static String country;
17 //下面是 一个静态代码块
18 static {
19 country="china";
20 System.out.println("Person类中的静态代码块执行了");
21 }
22 }
来源:https://www.cnblogs.com/ZengBlogs/p/12168792.html