static静态代码块和静态方法
static关键字
- static修饰的方法或变量,优先于对象执行,所以内存会先有static修饰的内容,后有对象的内容
- 可以用来修饰类的成员方法、类的成员变量,还可以编写static静态代码块
- 修饰变量就是类变量,修饰方法就是类方法
- 总结:类变量或者类方法,可以直接通过类名.方法名或者变量名进行调用,不用经过对象
public static class Student{
static int age;
public static String name;
public static void speak() {
System.out.println("唱歌🎤");
}
}
public class Student {
static int age;
public static String name;
public static void speak() {
System.out.println("唱歌🎤");
}
}
static变量也称作静态变量
- 和非静态变量的区别是,静态变量被所有的对象所共享,在内存中只有一份,它当且仅当在类初次加载时会被初始化。非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响
- static成员变量的初始化顺序按照定义的顺序进行初始化
static方法也称作静态方法
- 不依赖于任何对象就可以进行访问,类名.方法名
- 不能访问类的非静态成员变量和非静态成员方法
注意事项
- 静态方法不能直接访问非静态变量
- 静态方法当中不能使用this
- 核心:一个类里面static修饰的不能访问非static修饰的成员或方法,而非static修饰的可以访问static修饰的成员或方法
静态代码块
- 加载类的时候,静态代码块会被执行一次,且只能执行一次
- 静态内容优先于非静态内容,所以静态代码比构造方法先执行
- 使用场景:用来一次性对静态成员变量进行赋值,或者类资源初始化等操作
class Person {
static {
System.out.println("我是静态代码块");
}
}
常考面试题
记得博主,在一次面试过程中,面试官出了这道题被吊打了。。。静态代码块、构造代码块、构造函数执行顺序
默认执行顺序为:静态代码块 > 构造代码块 > 构造函数
public class Student {
static {
System.out.println("我是静态代码块");
}
{
System.out.println("我是构造代码块");
}
public Student() {
System.out.println("我是构造函数");
}
}
执行顺序
继承关系时的执行顺序
老师类
class Teacher {
static {
System.out.println("我是【老师】静态代码块");
}
{
System.out.println("我是【老师】构造代码块");
}
public Teacher() {
System.out.println("我是【老师】构造函数");
}
}
学生类继承老师
public class Student extends Teacher{
static {
System.out.println("我是【学生】静态代码块");
}
{
System.out.println("我是【学生】构造代码块");
}
public Student() {
System.out.println("我是【学生】构造函数");
}
}
执行顺序
public class MyMain {
public static void main(String[] args) {
Student student=new Student();
}
}
打印结果:我是【老师】静态代码块 》我是【学生】静态代码块》我是【老师】构造代码块 》我是【老师】构造函数》我是【学生】构造代码块》我是【学生】构造函数
作者:陈彦斌