public class Example {
public static final List<String> foo = new ArrayList<String>();
}
class MyCode {
void whatever() {
Example.foo.add("Hello!");
}
}
public final class System {
static PrintStream out;
static PrintStream err;
static InputStream in;
...
}
public class PrintStream extends FilterOutputStream {
//out object is inherited from FilterOutputStream class
public void println() {
...
}
# 1 楼答案
很高兴你正在学习JAVA
我希望这些链接能帮助你更多地了解你的问题
# 2 楼答案
它们实际上是历史的侥幸。在整个java语言中,没有其他语言能与它们相提并论;对于学习java来说,最好接受这样一个事实,即它们与其他任何事物都不一样,这并不重要
小心——如果你一定要知道的话
out
、err
和in
都是public static
类中的public static
字段。它们被标记为final
,因此System.out = null;
是不合法的,但它们实际上不是最终的(因为它们可以更改)。改变它们的支持是System.setOut
应用的一种黑客攻击。这个方法调用本机代码(这是一个用C/assembler实现的java方法,也就是说,一个直接针对运行VM的平台的实现,java上的每个体系结构都有自己的实现)总之,这是一种荒谬的方式,但事实就是这样
那为什么这是合法的
语法本身没有什么特别之处,尽管没有建议,因此,您很少看到它。想象一下你有这个:
这可以很好地编译和运行
Example
指的是示例类,Example.foo
指的是其中名为foo
的公共字段,Example.foo.add
指的是取消对该字段的引用以找到该字段所指向的arraylist,并调用该列表的add
方法问题是,公共字段是“讨厌的”——它们不是惯用的(大多数java代码都不是这样工作的;因此,创建公共字段会让代码看起来很奇怪),字段不参与继承(不能通过接口声明实现它的任何类都会公开某些字段。字段不能被重写),你不能嘲笑他们,也不能虚拟化或抽象他们的本质
那么,为什么是系统呢。这么做
历史。如果java已经“修复”了这个错误,那么任何从sysin读取或写入sysout或syserr的代码都不会再以任何版本的java“修复”这个错误。有些语言可以做到这一点。Java在制度上对此非常犹豫(“破坏向后兼容性”)。这样做会导致项目坚持旧版本,导致社区分裂。想象一下,您编写了一个流行的java库。你必须发布18个独立的java版本,这将是一片混乱
# 3 楼答案
系统结构。出来println:
以下是对
System.out.println();
的解释:System
是{out
是系统类的静态成员字段,属于PrintStream
类型李>println
是PrintStream
类的一种方法李>注意:
System.out.println();
用于在控制台上打印。类似地System.in
是一个标准的InputStream
,连接到控制台程序的键盘输入