1. 程式人生 > >System.out::println; 是什麼鬼???

System.out::println; 是什麼鬼???

1.第一次見到該表示式的感受

    第一此次見到該表示式的時候,我還不知道什麼是方法引用,當時真是一臉蒙圈,然後問了好多同事,給我的解釋也是五花八門,但我還是感覺莫名其妙,有段時間想著就當一個特例記住就好了,不要再去深究了!!!但是我這個人,在這種時候就是很難說服自己,於是有了上篇文章,再回過頭來看這個問題,其實就變得非常簡單了。

2.揭開System.out::println的神祕面紗

    有過上篇部落格的鋪墊,這裡就直接上程式碼了:

package com.nrsc.lambda.MethodReference;

import
java.io.PrintStream; import java.util.function.Consumer; public class Demo2 { public static void main(String[] args) { /** * 我初次見到的寫法 */ Consumer<String> fun = System.out::println; fun.accept("hello world"); System.out.println("========================================"
); /** * 現在想想其實很簡單,檢視println方法的原始碼得知println是PrintStream類中的一個非靜態方法 * 因此按照方法引用的邏輯,它肯定可以使用 * “函式式介面 變數名 = 類例項::方法名” 的方式對該方法進行引用 * * 而System.out的作用肯定就是來獲取PrintStream類的一個類例項, * * 驗證程式碼如下: */ PrintStream out = System.out;
Consumer<String> fun2 = out::println; fun2.accept("hello beijing"); } }

3.為什麼不直接使用PrintStream,而要用System.out呢?

    不知道大家會不會有此疑惑,反正我當時看明白System.out::println這句話的時候,就在想為什麼不直接建立PrintStream物件來構建其類例項呢?

   這個問題其實只要掃一眼PrintStream類的原始碼,應該就不會再有了。PrintStream類並沒有無參構造,而其有參建構函式不是要流,就是要File檔案,想要直接通過new一個PrintStream類的方式來建立例項,將變得非常麻煩。因此,通過System.out的方式獲取一個PrintStream例項的方式才會成為實際使用的方式。
在這裡插入圖片描述