您的位置 首页 java

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

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如何给一个final变量重新赋值?

文章地址:https://www.zhihuclub.com/197502.shtml

关于作者: 智云科技

热门文章

网站地图