有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java输入和输出流

什么是系统。在和系统中。用java开发java程序?我知道怎么用,但我知道怎么用。”运算符的使用看起来好像对象输入/输出本质上是静态的,即使我没有得到它


共 (3) 个答案

  1. # 2 楼答案

    它们实际上是历史的侥幸。在整个java语言中,没有其他语言能与它们相提并论;对于学习java来说,最好接受这样一个事实,即它们与其他任何事物都不一样,这并不重要

    小心——如果你一定要知道的话

    outerrin都是public static类中的public static字段。它们被标记为final,因此System.out = null;是不合法的,但它们实际上不是最终的(因为它们可以更改)。改变它们的支持是System.setOut应用的一种黑客攻击。这个方法调用本机代码(这是一个用C/assembler实现的java方法,也就是说,一个直接针对运行VM的平台的实现,java上的每个体系结构都有自己的实现)

    总之,这是一种荒谬的方式,但事实就是这样

    那为什么这是合法的

    语法本身没有什么特别之处,尽管没有建议,因此,您很少看到它。想象一下你有这个:

    public class Example {
        public static final List<String> foo = new ArrayList<String>();
    }
    
    class MyCode {
        void whatever() {
           Example.foo.add("Hello!");
        }
    }
    

    这可以很好地编译和运行Example指的是示例类,Example.foo指的是其中名为foo的公共字段,Example.foo.add指的是取消对该字段的引用以找到该字段所指向的arraylist,并调用该列表的add方法

    问题是,公共字段是“讨厌的”——它们不是惯用的(大多数java代码都不是这样工作的;因此,创建公共字段会让代码看起来很奇怪),字段不参与继承(不能通过接口声明实现它的任何类都会公开某些字段。字段不能被重写),你不能嘲笑他们,也不能虚拟化或抽象他们的本质

    那么,为什么是系统呢。这么做

    历史。如果java已经“修复”了这个错误,那么任何从sysin读取或写入sysout或syserr的代码都不会再以任何版本的java“修复”这个错误。有些语言可以做到这一点。Java在制度上对此非常犹豫(“破坏向后兼容性”)。这样做会导致项目坚持旧版本,导致社区分裂。想象一下,您编写了一个流行的java库。你必须发布18个独立的java版本,这将是一片混乱

  2. # 3 楼答案

    系统结构。出来println:

    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() {
        ...
    }
    

    以下是对System.out.println();的解释:

    1. System是{}中的最后一个类
    2. out是系统类的静态成员字段,属于PrintStream类型
    3. printlnPrintStream类的一种方法

    注意:System.out.println();用于在控制台上打印。类似地System.in是一个标准的InputStream,连接到控制台程序的键盘输入