final、static、参数传递

1、final关键字只是表示存储在变量中的对象引用不会指示其他变量,但这个对象本身可以改变。

参考

/*
来源:CSDN
https://blog.csdn.net/u012110719/article/details/46334413
日期:2018/7/15
 */
package cn.mys;

/*
 * 问题:使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
 * 答:
 * 使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。
 */
public class Test3 {
    // final修饰基本类型的变量
    public static final char CHAR = '中';
    // final修饰引用类型的变量
    public static final StringBuffer a = new StringBuffer("StringBuffer");

    public static void main(String[] args) {
        // 编译报错,引用不能变
        // a = new StringBuffer("hehe");
        // 引用变量所指向的对象中的内容还是可以改变的
        a.append("xxx");

    }

    public static int method1(final int i) {
        // i = i + 1;// 编译报错,因为final修饰的是基本类型的变量
        return i;
    }

    // 有人在定义方法的参数(引用变量)时,可能想采用如下的形式来阻止方法内部修改传进来的参数对象,
    // 实际上,这是办不到的,在该方法内部任然可以增加如下代码来修改参数对象
    public static void method2(final StringBuffer buffer) {
        buffer.append("buffer");// 编译通过,因为final修饰的是引用类型的变量
    }

}

2、 static修饰的静态变量其值可以改变,静态常量其值不可改变

静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。静态变量并不是说其就不能改变值,不能改变值的量叫常量。

/*
作者:mys
功能:测试static的值是否可以改变
日期:2018/7/15
 */
package cn.mys;
import java.io.*;
public class Test2 {
    public static void main(String []args){
        Test.idStatic++;//编译成功,常量可修改
        System.out.println("idStatic="+Test.idStatic);
        //PI++;编译不成功,常量不可修改
        System.out.println("PI="+Test.PI);
        //System.out也是多次使用的静态常量,其值不可修改
        //System.out=new PrintStream("....");
    }
}
class Test{
    static int idStatic;//如果不赋初值,默认为0
    static final double PI=3.1415926;//常量初始化时要赋初值
    }
3、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

参考
Java中没有指针,所以也没有引用传递,仅仅有值传递不过可以通过对象的方式来实现引用传递 类似java没有多继承 但可以用多次implements接口实现多继承的功能
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
Java参数按值传递
面试题:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是值传递。Java编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。

/*
作者:mys
功能:测试方法参数的使用
 */
package cn.mys;

public class Test4 {
    public static void main(String []args){
        Employee emp1=new Employee("aa");
        Employee emp2=new Employee("bb");
        //方法参数是对象的引用
        //方法并没有改变存储在变量中的对象引用,
        // 两个参数被初始化为两个对象引用的拷贝,交换的只是这两个拷贝
        Employee.swap(emp1,emp2);
        System.out.println("emp1="+emp1.name);
        System.out.println("emp2="+emp2.name);
    }
}
class Employee{
    public String name;
    public Employee(String name){
        this.name=name;
    }
    //交换
    public static void swap(Employee emp1,Employee emp2){
        Employee temp=emp1;
        emp1=emp2;
        emp2=temp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LocalDateTimeSerializer 是 Jackson 序列化库中的一个类,用于将 Java 8 中的 LocalDateTime 类型序列化为字符串。如果要接收外部递的参数,可以通过构造函数来实现。 LocalDateTimeSerializer 的构造函数有一个可选参数,即 DateTimeFormatter。通过这个参数可以指定序列化时使用的日期时间格式。示例代码如下: ``` public class MyObject { @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime dateTime; public MyObject(LocalDateTime dateTime) { this.dateTime = dateTime; } public static class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> { private final DateTimeFormatter formatter; public LocalDateTimeSerializer() { this(DateTimeFormatter.ISO_LOCAL_DATE_TIME); } public LocalDateTimeSerializer(DateTimeFormatter formatter) { this.formatter = formatter; } @Override public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString(formatter.format(value)); } } } ``` 在这个示例中,我们定义了一个 LocalDateTimeSerializer 类,并在其中通过构造函数接收了一个 DateTimeFormatter 类型的参数。如果没有递这个参数,则使用默认的 ISO_LOCAL_DATE_TIME 格式进行序列化。 在 serialize 方法中,我们使用入的 formatter 对象格式化 LocalDateTime 对象,并将格式化后的字符串写入到 JsonGenerator 中,完成序列化操作。 在使用时,可以通过递不同的 DateTimeFormatter 对象来改变日期时间格式。例如: ``` DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); LocalDateTime dateTime = LocalDateTime.now(); MyObject obj = new MyObject(dateTime); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(obj); System.out.println(json); // {"dateTime":"2022-07-25 16:20:30"} ``` 在这个示例中,我们使用了自定义的日期时间格式,并将其递给了 LocalDateTimeSerializer 的构造函数。最终序列化的结果是按照自定义格式进行格式化的字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值