概念
static是Java中的关键字-修饰符,用于修饰变量、方法、代码块、内部类
静态变量
被static修饰的成员变量
静态变量会随着类的加载而加载到静态区,与类同级,也叫类变量。
可以直接通过类名+. 的方法来直接调用,也可以通过对象来调用
静态区会对存储的静态变量赋予初始值。类创建的所有对象的属性都要共享同一个静态变量,所有对象的操作的是同一个静态变量
如果属性需要被所有对象共享,就加上static修饰
静态变量可以定义在方法中吗?
不能,静态变量与类同级,需要最先加载,但是方法中的内容只有等到方法被调用执行的时候才可以出现,因此不可以定义在方法中。
被static修饰的内存管理
public class StaticDemo {
public static void main(String[] args) {
Person person = new Person();
//默认为初始值
System.out.println(person.toString());
person.name="lili";
person.age=10;
person.gender='女';
//将person对象进行赋值
System.out.println(person.toString());
Person person1 = new Person();
System.out.println(person1.toString());
person1.name="wangwu";
person1.age=20;
person1.gender='男';
System.out.println(person1.toString());
System.out.println(person.toString());
}
}
class Person{
String name;
int age;
static char gender;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
}
静态方法
随着类的加载(静态常量池)而加载到静态区,与类同级,也叫类方法,通过类型.的形式来调用,也可以通过对象来调用。静态区不会堆静态方法赋予初始值,但是静态方法被调用时会被加载到栈中执行。
静态方法(main方法)里面可以使用this吗?
静态方法与类同级,this与对象同级,因此不可以
main方法中可以直接调用非静态属性和方法吗?
不可以,级别不一致,静态信息不能直接调用非静态信息,但是可以直接调用静态信息
非静态信息可以直接调用静态和非静态信息
静态方法中有重载吗?
有重载
静态方法中有重写吗?
没有,静态方法与类同级,重写与对象是一个级别的,因此没有重写。
静态方法是类在加载的时候就被加载到了内存中的方法,整个过程保持不变。
注意:
如果子类中定义的静态方法(类方法)与父类中的静态方法(类方法)具有相同的返回值类型、方法名、方法参数的类型和个数完全相同,则称子类的该方法隐藏了父类的方法。当子类创建的对象调用该隐藏方法的时候,默认调用的是子类中的方法
静态代码块
static修饰构造代码块
static{
}
优先于构造方法和构造代码块先执行
用域提前加载某些信息和资源
类只能加载一次,静态信息也就只能加载一次
父子类执行顺序(父类静态信息,子类静态信息,父类对象级别信息,子类对象级别信息)
对象级别包含:属性、构造代码块、构造方法
public class Demo04 {
public static void main(String[] args) {
Dog dog = new Dog();
}
}
class Animal{
static int num;
static{
System.out.println("父类静态代码块"+num);
num = 10;
}
public Animal(){
num=20;
System.out.println("父类构造方法查看修改结果"+num);
}
}
class Dog extends Animal{
static int j = 10;
static {
j=20;
System.out.println("子类静态构造代码块执行"+j);
}
public Dog(){
j=50;
System.out.println("子类构造方法执行"+j);
}
}