• static关键字


    1.修饰成员变量

    public class Person {
        String name;
        int age;
        
        public String toString() {
            return "Name:" + name + ", Age:" + age;
        }
        
        public static void main(String[] args) {
            Person p1 = new Person();
            p1.name = "zhangsan";
            p1.age = 10;
            Person p2 = new Person();
            p2.name = "lisi";
            p2.age = 12;
            System.out.println(p1);
            System.out.println(p2);
        }
        /**Output
         * Name:zhangsan, Age:10
         * Name:lisi, Age:12
         *///~
    }

    根据Person构造出的每一个对象都是独立存在的,保存有自己独立的成员变量,相互不会影响

    static关键字可以修饰成员变量和方法,来让它们变成类的所属,而不是对象的所属,比如将Person的age属性用static进行修饰

    例如:

    public class Person {
        String name;
        static int age;
        
        /* 其余代码不变... */
    
        /**Output
         * Name:zhangsan, Age:12
         * Name:lisi, Age:12
         *///~
    }

    在给p2的age属性赋值时,干扰了p1的age属性,如图所示:

    给age属性加了static关键字之后,Person对象就不再拥有age属性了,age属性会统一交给Person类去管理,即多个Person对象只会对应一个age属性,一个对象如果对age属性做了改变,其他的对象都会受到影响。此时的age和toString()方法一样,都是交由类去管理。

    static让对象共享属性一般都用这种方法:

    public class Person {
        private static int count = 0;
        int id;
        String name;
        int age;
        
        public Person() {
            id = ++count;
        }
        
        public String toString() {
            return "Id:" + id + ", Name:" + name + ", Age:" + age;
        }
        
        public static void main(String[] args) {
            Person p1 = new Person();
            p1.name = "zhangsan";
            p1.age = 10;
            Person p2 = new Person();
            p2.name = "lisi";
            p2.age = 12;
            System.out.println(p1);
            System.out.println(p2);
        }
        /**Output
         * Id:1, Name:zhangsan, Age:10
         * Id:2, Name:lisi, Age:12
         *///~
    }

    上面的代码起到了给Person的对象创建一个唯一id以及记录总数的作用,其中count由static修饰,是Person类的成员属性,每次创建一个Person对象,就会使该属性自加1然后赋给对象的id属性,这样,count属性记录了创建Person对象的总数,由于count使用了private修饰,所以从类外面无法随意改变。

    2.修饰成员方法

    static的另一个作用,就是修饰成员方法。相比于修饰成员属性,修饰成员方法对于数据的存储上面并没有多大的变化,因为我们从上面可以看出,方法本来就是存放在类的定义当中的。static修饰成员方法最大的作用,就是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗,会经常在帮助类中看到它的使用:

    public class PrintHelper {
    
        public static void print(Object o){
            System.out.println(o);
        }
        
        public static void main(String[] args) {
            PrintHelper.print("Hello world");
        }
    }

    3.静态块

    以下面的代码为例:

    package com.dotgua.study;
    
    class Book{
        public Book(String msg) {
            System.out.println(msg);
        }
    }
    
    public class Person {
    
        Book book1 = new Book("book1成员变量初始化");
        static Book book2 = new Book("static成员book2成员变量初始化");
        
        public Person(String msg) {
            System.out.println(msg);
        }
        
        Book book3 = new Book("book3成员变量初始化");
        static Book book4 = new Book("static成员book4成员变量初始化");
        
        public static void main(String[] args) {
            Person p1 = new Person("p1初始化");
        }
        /**Output
         * static成员book2成员变量初始化
         * static成员book4成员变量初始化
         * book1成员变量初始化
         * book3成员变量初始化
         * p1初始化
         *///~
    }

    Person类中组合了四个Book成员变量,两个是普通成员,两个是static修饰的类成员。可以看到,当new一个Person对象时,static修饰的成员变量首先被初始化,随后是普通成员,最后调用Person类的构造方法完成初始化。也就是说,在创建对象时,static修饰的成员会首先被初始化,而且还可以看到,如果有多个static修饰的成员,那么会按照他们的先后位置进行初始化。

    static修饰的成员的初始化可以更早的进行

    例子:

    class Book{
        public Book(String msg) {
            System.out.println(msg);
        }
    }
    
    public class Person {
    
        Book book1 = new Book("book1成员变量初始化");
        static Book book2 = new Book("static成员book2成员变量初始化");
        
        public Person(String msg) {
            System.out.println(msg);
        }
        
        Book book3 = new Book("book3成员变量初始化");
        static Book book4 = new Book("static成员book4成员变量初始化");
        
        public static void funStatic() {
            System.out.println("static修饰的funStatic方法");
        }
        
        public static void main(String[] args) {
            Person.funStatic();
            System.out.println("****************");
            Person p1 = new Person("p1初始化");
        }
        /**Output
         * static成员book2成员变量初始化
         * static成员book4成员变量初始化
         * static修饰的funStatic方法
         * ***************
         * book1成员变量初始化
         * book3成员变量初始化
         * p1初始化
         *///~
    }

    初始化static修饰的成员时,可以将他们统一放在一个以static开始,用花括号包裹起来的块状语句中:

    class Book{
        public Book(String msg) {
            System.out.println(msg);
        }
    }
    
    public class Person {
    
        Book book1 = new Book("book1成员变量初始化");
        static Book book2;
        
        static {
            book2 = new Book("static成员book2成员变量初始化");
            book4 = new Book("static成员book4成员变量初始化");
        }
        
        public Person(String msg) {
            System.out.println(msg);
        }
        
        Book book3 = new Book("book3成员变量初始化");
        static Book book4;
        
        public static void funStatic() {
            System.out.println("static修饰的funStatic方法");
        }
        
        public static void main(String[] args) {
            Person.funStatic();
            System.out.println("****************");
            Person p1 = new Person("p1初始化");
        }
        /**Output
         * static成员book2成员变量初始化
         * static成员book4成员变量初始化
         * static修饰的funStatic方法
         * ***************
         * book1成员变量初始化
         * book3成员变量初始化
         * p1初始化
         *///~
    }

    总结

    static是java中非常重要的一个关键字,主要有四种用法:

    1. 用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
    2. 用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
    3. 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
    4. 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。
  • 相关阅读:
    Oracle--pl/sql编程-分支语句(判断、循环)
    axios二次封装及API接口统一管理
    Vuejs之axios获取Http响应头
    对webpack和gulp的理解和区别
    nodejs+redis使用
    Linux安装Nginx、Redis、django
    js 原型里面写方法
    在layui中使用 jquery 触发select 的 change事件无效
    promise看这篇就够了
    vue 封装原型方法 加 promist .then
  • 原文地址:https://www.cnblogs.com/qq1312583369/p/10958997.html
Copyright © 2020-2023  润新知