• Java Static


    Static

    变量被 static 修饰

    1. static 修饰的变量在类中只有一份,可以称为类变量,其他变量称为实例变量
    2. 在方法区加载类的时候,会检查类中是否存在静态变量,如果存在则会在堆内存区域开辟一块空间用于存储静态变量。方法区中的静态变量存放堆内存中的地址
    3. 每个类的对象都会存放类在方法区的地址。
    4. 可以通过类名或者对象访问类变量。访问原理是通过对象中存放的类地址找到类变量
      img.png

    统计对象创建个数

    public class User {
        public static int userNumber;
        public User(){
            ++userNumber;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    方法被 static 修饰

    1. static 修饰的方法称为类方法,在内存中只有一份。其他方法称为实例方法
    2. 类方法可以通过类名访问(推荐),对象访问也行(但不推荐)
    3. 类方法常用于在工具类中实现。在项目中多次调用,但只有一份内存占用。
      • 工具类构造函数私有化可以防止对象创建
    static void printLog(){
        System.out.println("This is Student Class");
    }
    
    • 1
    • 2
    • 3

    使用的注意事项

    1. static 方法只能访问 static 成员,不能访问实例成员。
      • static 变量只有一份,通过类找到。实例成员可能有多份,由对象存放。类方法无法确定当前的成员变量是哪个对象的,所以无法访问
    2. 实例方法既可以访问实例变量,也可以访问类变量
    3. 实例方法可以获取 this 指针,但类方法不能获取 this 指针

    代码块

    1. 静态代码块: static {}
      • 类加载的时候自动执行。由于类只会加载一次,所以静态代码也只会执行一次
      • 作用:可以完成的初始化。例如对类变量的初始化
    2. 实例代码块:{}
      • 创建对象时执行实例代码块,且在构造函数前执行
      • 作用:完成对象的初始化。例如,用于对实例变量赋值(所有实例都是这个值)
     static String school;
     static {
         school = "SDU";
         System.out.println("static block code run");
     }
    
     {
         System.out.println("Student Object Creat!" + this);
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    单例设计模式

    1. 一个类只有一个对象,获取类的对象时,对象已经提前创建好了
    2. 构造函数私有
    3. 一个 private 的 static 变量保存一个类的对象
    4. 一个 public 的 static 方法返回保存的类对象
    public class SingleInstance {
        int a;
        private static SingleInstance oneObject = new SingleInstance();
        private SingleInstance(){
            a = 100;
        }
        public static SingleInstance getObject(){
            return oneObject;
        }
    }
    
    // 使用:
    SingleInstance obj1 = SingleInstance.getObject();
    System.out.println(obj1.a);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    如何在拿对象的时候(使用这个类的对象时候)才创建对象,且对象唯一?
    (懒汉单例设计模式)
    仅创建一个空指针,而不赋值。当有人获取对象时,判断类变量是否为null再决定是否创建

    public class LazySingleInstance {
        private static LazySingleInstance oneObject;
    
        public static LazySingleInstance getObject(){
            return oneObject = oneObject == null ? new LazySingleInstance() : oneObject;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  • 相关阅读:
    实战指南:使用 xUnit 和 ASP.NET Core 进行集成测试【完整教程】
    115道Java面试题
    redis分布式锁
    [ 常用工具篇 ] 解决 kali 下载速度软件慢的问题 -- kali换源
    HTML5期末大作业:美食网页主题网站设计与实现——HTML+CSS+JavaScript月饼美食食品企业网站html模板9页面
    深度之眼(十七)——Python标准库
    柯桥外语学习|考级英语|四六级和高考英语的差距
    再也不怕面试官拷打Go数据结构了!-Go语言map详解
    OpenAI正式发布第一个官方.NET版本库的测试版
    Docker快速搭建RTMP服务(tiangolo/nginx-rtmp:Docker + Nginx+ nginx-rtmp-module)
  • 原文地址:https://blog.csdn.net/qq_45364953/article/details/133870015