龙空技术网

java如何给一个final变量重新赋值?

咕嘟咕嘟小鱼儿 542

前言:

目前看官们对“java对象初始化赋值”可能比较注重,兄弟们都需要了解一些“java对象初始化赋值”的相关资讯。那么小编也在网络上搜集了一些对于“java对象初始化赋值””的相关知识,希望各位老铁们能喜欢,同学们快快来了解一下吧!

java中的final变量通常只能在初始化载入的时候赋值,一旦被赋值就无法再修改。但我在看java.lang.System源码的时候发现,它的PrintWriter变量out居然是final的,并且是被初始化为null的。我们平时使用的System.out.println()居然还有这样的实现,让人有点摸不着头脑,后经过进一步追踪,发现有个native方法setOut0能够对out进行重新赋值。于是大悟,原来是通过c++语法来避开java final无法修改的问题呀。于是仿System做了一个自己的实现。如下:


package zhc.others;


import java.io.BufferedOutputStream;

import java.io.FileDescriptor;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.PrintStream;


public class MySystem {

public static native void setOut(PrintStream out);

public static final PrintStream out2 = null;

public static final PrintStream out = newPrintStream();

private static PrintStream newPrintStream() {

PrintStream ps = null;

FileOutputStream fos = new FileOutputStream(FileDescriptor.out);

try {

ps = new PrintStream(new BufferedOutputStream(fos, 128), true, "UTF-8");

} catch (IOException e) {

e.printStackTrace();

}

return ps;

}

private MySystem() {}


public static void main(String[] args) {

MySystem.out.println("Hello,World! -- print by MySystem.out");

String tPath = MySystem.class.getResource("")+"zhc_others_MySystem.dll";

System.load(tPath.substring(6).replace("/", "\\").replace("%20", " "));


setOut(newPrintStream());

if (null!=out2) {

out2.println("Hello,World2! -- print by out2(final PrintStream out2 = null)");

}

}

}

标签: #java对象初始化赋值