为啥 Java 的输出语句这么长? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yuntong
V2EX    Java

为啥 Java 的输出语句这么长?

  •  
  •   yuntong 2016-02-04 15:11:25 +08:00 8228 次点击
    这是一个创建于 3588 天前的主题,其中的信息可能已经有所发展或是发生改变。

    System.out.println("");

    对比其他语言的输出语句会发现它很长.

    有人说也可以把这个做短了啊!

    那为啥 java 官方不把他做短了呢?

    51 条回复    2016-02-06 15:36:35 +08:00
    zts1993
        1
    zts1993  
       2016-02-04 15:22:19 +08:00
    log.info 并不是很长。
    WenhaoWu
        2
    WenhaoWu  
       2016-02-04 15:58:05 +08:00
    ide 里不都是 sout 然后 tab 吗
    dullwit
        3
    dullwit  
       2016-02-04 16:02:09 +08:00
    Java 里的方法都是依赖于类,不能存在独立的函数。
    唯一的办法就是 import static
    echo1937
        4
    echo1937  
       2016-02-04 16:10:24 +08:00
    一般靠 IDE 进行快速输入,至于看着看无所谓。
    raysonx
        5
    raysonx  
       2016-02-04 16:15:28 +08:00   1
    因 Java 信仰面向象(然 int,double 等型的例不是象)
    iburu
        6
    iburu  
       2016-02-04 16:15:52 +08:00
    scala 大法好
    jasontse
        7
    jasontse  
       2016-02-04 16:16:36 +08:00 via Android
    做短了就破坏 Java 原有的语法结构和规则了啊
    hoaly
        8
    shoaly  
       2016-02-04 16:21:14 +08:00   1
    当初从 java 跳 php 的一个原因就是 java 没有系统函数 类似 md5, json_encode, 想不通
    ppwangs
        9
    ppwangs  
       2016-02-04 16:30:10 +08:00   1
    import static java.lang.System.out;
    ...
    {
    out.print("我也不是很长");
    }
    htfy96
        10
    htfy96  
       2016-02-04 16:36:38 +08:00
    @ppwangs 这个和#define P(X) printf(#X) 然后 P(我更短)有什么区别…
    ppwangs
        11
    ppwangs  
       2016-02-04 16:43:19 +08:00
    @htfy96 copy 一段
    static import 是 Java 5 增加的功能。
    就是将 Import 类中的静态方法,可以作为本类的静态方法来用。
    谁让 java 面向对象来的。
    SilentDepth
        12
    SilentDepth  
       2016-02-04 16:45:53 +08:00
    严格信仰 OO 的结果。「上帝先创造了 System ,并告诉它 out ,才有了 println()……」
    shyling
        13
    shyling  
       2016-02-04 16:47:25 +08:00 via iPad
    常就长呗~
    std::cout<<"长与短并不重要";
    Console.Write("楼上说的对");
    spance
        14
    spance  
       2016-02-04 16:47:33 +08:00   6
    java 世界不会凭空存在一个 printf(),方法是一个对象的属有的,对象要是基于一个类(模板)来产生的。

    out 是 java.lang.System 类的一个静态成员,为什么要放到 System 类,因为 stdout,stderr 等是由 system 提供的;

    out 成员具有 print,write 等方法,表示这些 write print 的操作就是说这个 out 实例自己有这个行为,而不是莫名其妙冒出一个全局的行为。

    属主(对象)才会自己具有行为,这就是面向对象的实例和方法的思想,一定都不奇怪,反倒当你深入面向对象后,才会认为凭空出现的全局方法是很突兀的。
    shyling
        15
    shyling  
       2016-02-04 16:48:14 +08:00 via iPad
    @shoaly 你说这个优点 php 好像想甩掉呢。。
    yuriko
        16
    yuriko  
       2016-02-04 16:48:36 +08:00
    java 语法讲究规范性,这条输出语句很清楚的表明了操作内容
    System 是个类,然后我们找到了其中的 out 这个静态的 PrintStream 实例,然后通过其 PrintStream 的 println 方法进行打印

    和其他语言不同在于, Java 并没有为输出语句做一些特别的优化来减少调用时的麻烦,这和 Java 的语法风格不符
    同时你可以试试只使用 System.out 来获取输出流做一些其他奇奇怪怪的事情
    shyling
        17
    shyling  
       2016-02-04 16:50:15 +08:00 via iPad   1
    @spance 把一个 print 方法加到 java.lang.Object 里,这样就不突兀了
    Zzzzzzzzz
        18
    Zzzzzzzzz  
       2016-02-04 16:53:21 +08:00
    来, scala 和 groovy 选一个吧.
    uxstone
        19
    uxstone  
       2016-02-04 16:57:02 +08:00
    所以习惯了 java ,
    再看 js 的代码,那叫一个痛苦。
    tobyxdd
        20
    tobyxdd  
       2016-02-04 16:57:28 +08:00
    这叫 OOP
    spance
        21
    spance  
       2016-02-04 16:58:04 +08:00
    @shyling Object 是一个 root 级抽象描述,它怎么会有 print 这样的行为?好比我们给 Car 对象定义一个 makeLove()是不是很不合逻辑?
    System.out 这个对象代表了标准输出流,它有动作行为可以提供给你, write,print... 让它 print 它就输出显示了,里面是怎么一回事不需要知道,只知道你让他 print 一下他就能输出 /显示,并且这是他自己的动作,这就可以了。
    leohuachao
        22
    leohuachao  
       2016-02-04 17:06:29 +08:00
    面向对象就是这么写的,要弄短也只是个语法糖而已
    shyling
        23
    shyling  
       2016-02-04 17:08:19 +08:00 via iPad
    @spance 举例有点没节操→_→还好吧,我只是说一个解决方案。想想 java.lang.Object 里的方法, wait/notify/notifyAll/equals/hashCode 从逻辑上不一定要位于 Object 上呀。例如放到 Waitable,Comparable,Hashable 也是可以的呀。像 golang ,内置了 println ,还可以用 fmt.Println
    spance
        24
    spance  
       2016-02-04 17:24:57 +08:00
    @shyling 好吧,换个温柔点的比方,面向对象世界里面我们就像是女娲,不断的制造对象,并吩咐他们做 xxx ,他们再去吩咐别人 xxx ,然后所有对象都在 xxxing ,那么程序就执行起来了。
    Object 是个基类,让他具有一些普世的、共通的行为,以便所有对象都有这个行为,当然也能做很多个接口去仔细的描述归类这些行为,但是也要在过度抽象和具象之间有个平衡,抽象的太狠了效率不高而且也不好用了,抽象的不够又不足以承载面向对象的思想,所以还是要平衡。
    shyling
        25
    shyling  
       2016-02-04 17:31:13 +08:00 via iPad
    @spance 嗯,是这样子没错←_←,不过有时设计语言也要考虑性能啊,开发者的原因。就像上面说的基本类型不是对象, int 和 Integer 的关系,啦啦啦
    zonghua
        26
    zonghua  
       2016-02-04 17:42:49 +08:00 via iPhone
    @echo1937 sy so
    aivier
        27
    aivier  
       2016-02-04 18:14:05 +08:00
    Console.WriteLine(); 这个也挺麻烦的...还好 VS 有自动补全
    mfaner
        28
    mfaner  
       2016-02-04 19:13:19 +08:00
    哪有用那么频繁的
    WispZhan
        29
    WispZhan  
       2016-02-04 20:16:53 +08:00
    我来传播 kotlin,快来信仰 jetbrains 神教。
    kaneg
        30
    kaneg  
       2016-02-04 22:20:05 +08:00   1
    等你写过很多 Java 代码,你就会逐渐发现正规代码中几乎不会用到 System.out 来输出,而是用 log.xxx ,否则你会被 code reviewer 批。
    况且 IDE 都有快捷语句,如 IDEA ,用 sout 即可
    zaishanfeng
        31
    zaishanfeng  
       2016-02-04 22:44:24 +08:00 via Android
    java 是离了 ide 活不下去的语言 还是 echo print 爽
    Sumkor
        32
    Sumkor  
       2016-02-04 23:33:02 +08:00
    对我来说就是 syso
    jydeng
        33
    jydeng  
       2016-02-04 23:34:47 +08:00
    system.console.writeline("blabla") ,我 C#也挺长的。
    saximoer
        34
    saximoer  
       2016-02-04 23:35:01 +08:00
    syso
    sout

    基本都只这么打了。。
    onice
        35
    onice  
       2016-02-04 23:49:19 +08:00
    IDE 里面可以 syso 然后加上自动补全的快捷键。

    System.out.println("");这个因为 Java 默认不装载 System 包,所以要写全包名。

    在 Java 头部 import 下 System.out 包,程序里就可以直接用 Println 相关方法输出了。

    不过。。。一般没人这么干,都是直接写的 Println 的全路径, IDE 很方便了。。。
    Narcissu5
        36
    Narcissu5  
       2016-02-05 00:58:55 +08:00   1
    真正项目里面一般都是 logger.info(.....),print 实际上用的很少

    实际上 print 语句除了学习和技术验证之外并没有什么卵用
    woai110120130
        37
    woai110120130  
       2016-02-05 08:57:24 +08:00
    可读性好 语义清晰
    wizardforcel
        38
    wizardforcel  
       2016-02-05 12:24:35 +08:00 via Android
    因为 java 没有别名机制。

    c++和 c#都有 using 。
    woai110120130
        39
    woai110120130  
       2016-02-05 12:33:21 +08:00
    这就是 java 的简单之美
    charlie21
        40
    charlie21  
       2016-02-05 13:23:17 +08:00
    icedx
        41
    icedx  
       2016-02-05 16:47:53 +08:00
    @yuriko 解释的很好
    我觉得还有更丧病的, 比如 equals()
    nikubenki
        42
    nikubenki  
       2016-02-05 19:14:04 +08:00 via iPhone
    就 syso 嘛,有什么长的
    bombless
        43
    bombless  
       2016-02-05 23:26:59 +08:00
    Java 不是适合 hacker 的语言,不过好歹在学院派和工程派都能找到支持者, 233
    我觉得要求短的话 Perl 也许会合某些人胃口 233
    yuriko
        44
    yuriko  
       2016-02-06 07:44:52 +08:00
    @icedx 还有 campareTo 这种……私以为 toString 算是 Java 少有的语法糖了,应该废除 [逃~


    @bombless 的确, Java 的确不适合很多 hacker 要炫酷便捷开发的要求;同时由于其语言的严谨性和带来的可维护性,受大量传统工程开发的青睐,这也是为什么 Java 在企业级应用里常见的原因吧
    icedx
        45
    icedx  
       2016-02-06 08:45:43 +08:00
    @yuriko toString 不就是__str__()么 (逃
    wittyfox
        46
    wittyfox  
       2016-02-06 13:00:31 +08:00 via Android
    那是你没有见到这个

    `com.sun.java.swing.plaf.nimbus.InternalFrameInternalFrameTitlePaneInternalFrameTitlePaneMaximizeButtonWindowNotFocusedState`
    yuriko
        47
    yuriko  
       2016-02-06 13:38:18 +08:00
    @icedx 我是指 toString 的隐式转换,几个类的实例在做字符串拼接的时候会直接转换 1+""这种……
    icedx
        48
    icedx  
       2016-02-06 14:07:04 +08:00
    @yuriko 这么说的话我感觉其实 toString 很好用
    yuriko
        49
    yuriko  
       2016-02-06 14:08:23 +08:00
    @icedx 而且调试的时候,重写了 toString , ide 就能迅速的打印里面的信息了
    zonghua
        50
    zonghua  
       2016-02-06 14:12:20 +08:00 via iPhone
    @wittyfox Spring 里面有一个方法名 108 个字符
    icedx
        51
    icedx  
       2016-02-06 15:36:35 +08:00
    @yuriko 66666666 居然还能这么玩
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5285 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 08:42 PVG 16:42 LAX 00:42 JFK 03:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86