一、背景
1.关于这个问题就特别基础的问题了,可能好多人知道怎么去使用,但是理解可能不是太深入,今天咱们这篇文章就往深入的去理解。
二、概述
1.java编程思想里的解释:
1.1.static方法就是没有this的方法。
1.2.在static方法内部不能调用非静态方法,反过来是可以的。
1.3.而且可以没有创建任何对象的前提下,仅仅通过类本身来调用static方法,这实际上也正是static方法的主要用途。
三、使用场景
1.方便在没有创建对象的情况下来进行调用(方法/变量)。
2.类被加载了,就可以通过类名去进行访问static修饰的方法、变量。
3.可以编写static代码块来优化程序性能(优点)。
四、案例一
1.父类
public class Base {
static {
System.out.println("父类代码块Static Base");
}
public Base(){
System.out.println("父类的构造方法");
}
}
2.子类
public class TestStatic extends Base{
static {
System.out.println("子类代码块test static");
}
public TestStatic(){
System.out.println("子类构造器");
}
public static void main(String[] args) {
//new子类
//new TestStatic();
}
}
3.结果(没有new子类的情况下),你可能想到不会有结果,答案是错的,原因是执行main方法之前,必须先加载TestStatic类
父类代码块Static Base
子类代码块test static
3.1.结果(new子类的情况下),就是把new TestStatic();注释打开,结果如下:
父类代码块Static Base
子类代码块test static
父类的构造方法
子类构造器
五、案列二(如果这个案例你很清楚初始化顺序,肯定基础非常扎实)
1.Father类(main方法放到Son中也是这样的结果)
public class Father {
Person p = new Person("诺言");
static {
System.out.println("Father static");
}
public Father(){
System.out.println("Father 构造器");
}
public static void main(String[] args) {
new Son();
}
}
2.Son类
public class Son extends Father{
static {
System.out.println("Son static");
}
public Son(){
System.out.println("Son 构造器");
}
}
3.Person类
public class Person {
static {
System.out.println("Person staic");
}
public Person(String name){
System.out.println("Person"+name);
}
}
4.结果
Father static
Son static
Person staic
Person 诺言
Father 构造器
Son 构造器
总结:
1. main运行先加载Father类(Father static),
2. new Son()然后会去加载Son类(Son static),
3. Son的父类Father已经加载过了,
4. 然后调用构造器Son(),会先初始化父类Father成员变量,Person类初次加载(Person static),然后执行构造器的(Person 诺言)
5.父类(Father 构造器)
6.(Son 构造器)
六、对象的初始化过程优先级
1.父类静态代码块>>子类静态代码块>>main方法>>父类构造代码块>>父类构造函数>>子类构造代码块>>子类构造函数
2.静态成员变量>>静态方法>>普通成员变量>>构造器 (记住规律)
七、案例三
1.测试类
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public static void main(String[] args) {
Person person1 = new Person("诺言", 8);
Person person = new Person("诺言", 10);
System.out.println(person1);
System.out.println(person);
}
}
2.结果
Person{name='诺言', age=8}
Person{name='诺言', age=10}
3.age前加个static,其他都不变,结果:
Person{name='诺言', age=10}
Person{name='诺言', age=10}
4.分析:加上static age之后就变成了放在静态方法区中了,原来是在堆中的。
八、结束
Always keep the faith!!!