2020-08-19 static

本文详细解析Java中static修饰符的用途,包括静态方法、属性和代码块的特性及执行顺序。同时,深入探讨构造代码块的功能,以及它们在对象创建过程中的执行时机与作用。

一、static:

  静态的,static修饰的东西会随着字节码文件优先于类加载进内存
  

作用:

1.修饰方法:

    静态方法,不需要进行实例化就可以直接通过类名调用于类不属于对象,一般出现在工具类中,只能调用静态属性或方法   

2.修饰属性:

    静态属性,不需要进行实例化就可以直接通过类名调用于类不属于对象,所有对象共享一份数据   

3.修饰代码块:

    静态代码块,在类第一次被使用的时候会执行,仅执行一次先于构造代码块与构造方法,一般在连接数据库的时候使用造代码块在对象每次创建的时候均会执行   
对象创建执行顺序:
    静态构造代码块>构造代码块>构造方法

主方法

public class Main {
    public static void main(String[] args) {
        Static sta = new Static("菠萝");
        System.out.println("对象创建执行顺序:静态构造代码块>构造代码块>构造方法");
        System.out.println("有多个静态构造代码块的执行顺序:从上到下顺序执行");
        System.out.println("有多个构造代码块的执行顺序:从上到下顺序执行")}
}

package static_text;

public class Static {  
    //属性
    String name;
    //无参构造方法
    public Static(){
        System.out.println("默认构造方法");
    }
    //有参构造方法
    public Static(String name) {
        this.name = name;
        System.out.println(name);
    }
    //多个构造代码块
    {
        System.out.println("构造代码块3");
    }
    {
        System.out.println("构造代码块1");
    }

    //多个静态构造代码块
    static {
        System.out.println("静态构造代码块3");
    }
    static {
        System.out.println("静态构造代码块1");
    }
    static {
        System.out.println("静态构造代码块2");
    }
    {
        System.out.println("构造代码块2");
    }
}

结果:

静态构造代码块3
静态构造代码块1
静态构造代码块2
构造代码块3
构造代码块1
构造代码块2
菠萝
对象创建执行顺序:静态构造代码块>构造代码块>构造方法//写这一句话是为了加强记忆
有多个静态构造代码块的执行顺序:从上到下顺序执行
有多个构造代码块的执行顺序:从上到下顺序执行	

二、构造代码块

1.格式:

java类中使用{}声明的代码块(和静态代码块的区别是少了static关键字)
{
        System.out.println("构造代码块3");
    }

2.执行时机

构造代码块在创建对象的时候被调用,每创建一次对象都会调用一次,但是优先于构造函数执行,需要注意的是,听名字我们就知道,构造代码块不是优先于构造函数执行的,而是依托于构造函数,也就是说,如果你不实例化对象,构造代码块是不会执行的。

3.构造代码块的作用:

    (1)和构造函数的作用类似,都能够对象记性初始化,并且只要创建一个对象,构造代码块都会执行一次。但是反过来,构造函数则不会再每个对象创建的时候都执行(多个构造函数的情况下,建立对象时传入的参数不同则初始化使用对应的构造函数)     (2)利用每次创建对象的时候都会提前调用一次构造代码块特性,我们做诸如统计创建对象的次数等功能。

三、静态构造代码块

1.格式:

在java类中(方法中不能存在静态代码块)使用static关键字和{}声明的代码块:
public class CodeBlock{
     static{
        System.out.println("静态代码块");  
}      
}

2.执行时机

    静态代码块在类被加载的时候就运行了,而且只运行一次,并且优先于各种代码块以及构造函数。如果一个类中有多个静态代码块,就会按照书写的顺序执行。

3.静态代码块的作用:

    一般情况下,如果有些代码需要在项目启动的时候执行,这时就需要静态代码快,比如一个项目启动需要加载很多配置文件等资源,就可以都放在静态代码块中。
<think>首先,用户的问题是关于Fastjson如何同时处理两种不同格式的日期字符串:"2025-08-19 10:28:46.000000" 和 "2020-07-04 09:22:21.0"。用户需要一种方法来格式化这些日期,使Fastjson能够正确解析它们。 从系统指令来看,我需要: - 使用中文回答。 - 行内数学表达式用$...$格式。 - 独立公式用$$...$$格式。 - LaTeX语法正确。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识如[^1]。 用户提供了几个参考资料: - 引用[1]:提到fastjson解析日期报错,具体是解析带时区的ISO格式日期。 - 引用[2]:提到配置问题导致序列化失败。 - 引用[3]:Springboot使用fastjson序列化报错,原因是版本问题,建议更新到1.2.12以上。 - 引用[4]:fastjson反序列化LocalDateTime失败,显示日期格式问题。 用户的需求是处理两种格式:"YYYY-MM-dd HH:mm:ss.SSSSSS" 和 "YYYY-MM-dd HH:mm:ss.S"。第一个有6位微秒,第二个有1位秒后小数。 Fastjson解析日期时,通常依赖于日期格式配置。默认情况下,它可能不支持自定义格式,尤其是当小数部分长度不同时。 关键点: - Fastjson使用`JSON.parseObject`或反序列化时,可以通过配置`SerializeConfig`或`ParseConfig`来指定日期格式。 - 对于日期格式化,可以使用`DateFormat`或自定义`ObjectSerializer`和`ObjectDeserializer`。 - 用户引用的内容中提到版本问题(引用[3]),建议使用Fastjson 1.2.12或以上,因为旧版本可能不支持LocalDateTime或特定日期格式。 用户的问题是格式化日期,但从上下文看,更像是解析(反序列化)日期字符串。用户说“格式化”,但提到“解析代码”,所以可能是指反序列化。 在引用中: - 引用[1]:解析日期字符串报错。 - 引用[4]:反序列化LocalDateTime失败。 - 用户需求:同时处理两种日期格式的解析。 所以,我应该提供一种方法,让Fastjson能够解析这两种格式的日期字符串。 解决方案步骤: 1. **确保Fastjson版本正确**:建议使用1.2.12或以上版本,因为新版本有更好的日期支持(从引用[3]推断)。 2. **配置Fastjson的日期格式**:可以使用`fastjson.parser`设置日期格式。但标准格式如`yyyy-MM-dd HH:mm:ss.SSS`可能无法同时处理不同长度的秒后小数,因为`.SSS`只支持毫秒(3位)。 3. **自定义反序列化器**:为日期类型定义自定义的`ObjectDeserializer`来处理多种格式。 具体方法: - 创建一个自定义的`ObjectDeserializer`实现`com.alibaba.fastjson.parser.deserializer.ObjectDeserializer`。 - 在`deserialze`方法中,尝试解析不同的日期格式。 - 注册这个自定义反序列化器到`ParserConfig`。 例如,对于`java.util.Date`或`java.time.LocalDateTime`,可以写一个反序列化器来尝试多种格式。 用户可能使用的是`java.util.Date`或`java.time.*`类。从引用看,有使用`LocalDateTime`(引用[4]),所以假设使用Java 8的日期API。 代码示例: - 定义一个自定义反序列化器。 - 支持格式如:"yyyy-MM-dd HH:mm:ss.SSSSSS" 和 "yyyy-MM-dd HH:mm:ss.S"。 - 使用`DateTimeFormatter`来解析。 在回答中,结构要清晰: 1. 解释问题:Fastjson默认日期格式化可能不支持可变长度的秒后小数。 2. 解决方案:使用自定义反序列化器。 3. 代码示例:给出Java代码。 4. 注意事项:如版本要求。 生成相关问题: - 基于用户查询,生成2-3个相关问题。 回答结构: - 开头:重述问题。 - 步骤:逐步解释。 - 代码:用代码块展示。 - 结尾:相关问题。 引用添加: - 在相关内容末尾添加引用标识。既然用户提供引用[1]到[4],我应该引用它们,如果相关。例如: - 提到版本问题时,引用[3]。 - 提到日期解析错误时,引用[1]和[4]。 用户说“上述引用仅供参考”,所以我需要基于它们,但不完全依赖。 最终回答: - 确保使用中文。 - 格式化日期:用户说“格式化”,但从上下文,是解析。我会假设是反序列化日期字符串。 - 方法:自定义反序列化器。 </think>### Fastjson同时格式化不同精度的日期字符串 针对您的问题,需要让Fastjson同时解析和格式化两种日期格式:"2025-08-19 10:28:46.000000"(6位微秒)和"2020-07-04 09:22:21.0"(1位秒后小数)。Fastjson默认的日期格式化(如`yyyy-MM-dd HH:mm:ss.SSS`)无法处理秒后小数位数可变的情况,需要通过自定义配置实现。以下是逐步解决方案: --- ### 步骤1: 确保Fastjson版本正确 Fastjson旧版本(低于1.2.12)对日期支持不完善,容易引发解析错误(如引用[3]中提到的版本问题)[^3]。建议使用Maven或Gradle升级到最新版本: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.47</version> <!-- 推荐≥1.2.12 --> </dependency> ``` --- ### 步骤2: 自定义日期反序列化器(核心方案) 由于两种日期格式的秒后小数位数不同(6位或1位),需实现`ObjectDeserializer`接口来处理多种格式。以下是完整代码示例: ```java import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer; import com.alibaba.fastjson.util.IOUtils; import java.lang.reflect.Type; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Arrays; import java.util.List; // 自定义反序列化器,支持多种日期格式 public class MultiFormatDateDeserializer implements ObjectDeserializer { // 定义兼容的格式列表:6位微秒、1位小数、以及标准格式 private static final List<DateTimeFormatter> FORMATTERS = Arrays.asList( DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSS"), // 格式1: 6位微秒 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.S"), // 格式2: 1位小数 DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") // 后备格式 ); @Override public LocalDateTime deserialze(DefaultJSONParser parser, Type type, Object fieldName) { String dateStr = parser.parseObject(String.class); // 获取日期字符串 // 尝试所有格式,直到解析成功 for (DateTimeFormatter formatter : FORMATTERS) { try { return LocalDateTime.parse(dateStr, formatter); } catch (DateTimeParseException e) { // 继续尝试下一个格式 } } throw new RuntimeException("日期格式不支持: " + dateStr); // 所有格式均失败时报错 } @Override public int getFastMatchToken() { return IOUtils.LITERAL_STRING; } } ``` --- ### 步骤3: 注册自定义反序列化器并测试 在解析JSON时,将自定义反序列化器注册到Fastjson的配置中: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import java.time.LocalDateTime; import java.util.List; public class Test { public static void main(String[] args) { // 注册自定义反序列化器到LocalDateTime类型 ParserConfig.getGlobalInstance().putDeserializer(LocalDateTime.class, new MultiFormatDateDeserializer()); // 测试字符串(包含两种格式) String json1 = "{\"date\":\"2025-08-19 10:28:46.000000\"}"; // 6位微秒 String json2 = "{\"date\":\"2020-07-04 09:22:21.0\"}"; // 1位小数 // 解析测试 Temp1 obj1 = JSON.parseObject(json1, Temp1.class); Temp1 obj2 = JSON.parseObject(json2, Temp1.class); System.out.println(obj1.date); // 输出: 2025-08-19T10:28:46 System.out.println(obj2.date); // 输出: 2020-07-04T09:22:21 } } // 示例数据类 class Temp1 { public LocalDateTime date; } ``` --- ### 关键说明 1. **兼容性**:此方案支持`LocalDateTime`(Java 8+),如果使用`java.util.Date`,需稍作调整(例如改用`SimpleDateFormat`)。 2. **错误处理**:自定义反序列化器会按顺序尝试所有格式,避免类似引用[4]中的解析失败[^4]。 3. **序列化(输出)**:如果需要将日期统一格式化为字符串输出,可添加自定义`ObjectSerializer`,逻辑类似(例如固定输出为`yyyy-MM-dd HH:mm:ss.SSSSSS`)。 4. **配置冲突**:如引用[2]所述,避免全局HttpMessageConverter配置冲突[^2],确保只注册必要的反序列化器。 通过此方法,Fastjson能无缝处理不同精度的日期字符串,解决了类似引用[1]中日期解析报错的问题[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值