java中的static的作用(一定要紧抓基础)

版权声明:转载请注明出处 https://blog.csdn.net/chenmingxu438521/article/details/90111795

一、背景

1.关于这个问题就特别基础的问题了,可能好多人知道怎么去使用,但是理解可能不是太深入,今天咱们这篇文章就往深入的去理解。

二、概述

1.java编程思想里的解释:

1.1.static方法就是没有this的方法。

1.2.在static方法内部不能调用非静态方法,反过来是可以的。

1.3.而且可以没有创建任何对象的前提下,仅仅通过类本身来调用static方法,这实际上也正是static方法的主要用途。

三、使用场景

1.方便在没有创建对象的情况下来进行调用(方法/变量)。

2.类被加载了,就可以通过类名去进行访问static修饰的方法、变量。

3.可以编写static代码块来优化程序性能(优点)。

扫描二维码关注公众号,回复: 6211463 查看本文章

四、案例一

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!!!

猜你喜欢

转载自blog.csdn.net/chenmingxu438521/article/details/90111795