JavaSE学习18(接口组成更新,方法引用)
生活随笔
收集整理的這篇文章主要介紹了
JavaSE学习18(接口组成更新,方法引用)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
接口組成更新
1.1 接口組成更新概述
接口的組成常量: public static final 可省略抽象方法: public abstract 可省略 java8之后 加入了默認方法:靜態方法: java9之后 加入了私有方法:1.2 接口中的默認方法
接口中默認方法的定義格式public default 返回值類型 方法名(參數列表){ } public可省略 范例:default void show3(){ }接口中默認方法的注意事項:默認方法不是抽象方法,所以不強制被重寫。但是也可以重寫 重寫時去掉default關鍵字public可以省略 default不能省略1.3 接口中的靜態方法
接口中的靜態方法的定義格式:格式: public static 返回值類型 方法名(參數列表){ } public可以省略范例: static void show() { } 接口中靜態方法的注意事項:靜態方法只能通過接口名調用,不能通過實現類名或者對象名調用public可以省略 static不能省略1.4 接口中私有方法
java9中新增了帶方法體的私有方法,這其實在java8中就埋下了伏筆: java8允許在接口中定義帶方法體的 默認方法和靜態方法。這樣就肯能會引發一個問題: 當兩個默認方法或者靜態方法中包含同一段相同的代碼實現時, 程序必然考慮將這段實現代碼抽取成一個共性方法,而這個共性方法是不需要讓別人使用的,因此私有給隱藏起來, 這就是java9增加私有方法的必然性 接口中私有方法的定義格式:格式1: private 返回值類型 方法名(參數列表){ }范例: private void show() { }格式2: private static 返回值類型 方法名(參數列表) { }范例: private static void method() { } 接口中私有方法的注意事項:默認方法可以調用私有的靜態方法和非靜態方法靜態方法只能調用私有的靜態方法2 方法引用
2.1 體驗方法引用
在使用Lambda表達式的時候,我們實際上傳遞進去的代碼就是一種解決方案: 拿參數做操作 考慮一種情況: 如果我們在Lambda中指定的操作方案,已經有的地方存在相同的方案,還有必要寫重復的邏輯嗎? 使用已經存在的方案,就是 方法引用 public class PrintableDemo{public static void main(String[] args){usePrintable(s -> System.out.println(s));usePrintable(System.out::println);}private static void usePrintable(Printable p){p.printString("愛生活,愛java");} }2.2 方法引用符
方法引用符: :: 該符號位引用運算符,而它所在的表達式被稱為方法引用 回顧在體驗方法引用中的代碼Lambda表達式: usePrintable(s -> System.out.println(s));分析: 拿到參數s之后通過Lambda表達式,傳遞給System.out.println 方法去處理方法引用: usePrintable(System.out::println);分析: 直接使用System.out中的println方法來取代Lambda,代碼更加簡潔 推導和省略如果使用Lambda,那么根據 可推導就是可省略 的原則,無需指定參數類型,也無需指定重載形式,他們都將被自動推導如果使用方法引用,也是同樣可以根據上下文進行推導方法引用是Lambda的孿生兄弟2.3 Lambda表達式支持的方法引用
常見的引用方式:引用類方法:引用對象的實例方法引用類的實例方法引用構造器2.4 引用類方法
引用類方法,其實就是引用類的靜態方法 格式: 類名::靜態方法 范例: Integer::parseIntInteger類的方法: public static int parseInt(String s) 將此String轉換為int類型數據 練習:public class ConverterDemo {public static void main(String[] args) {//Lambda表達式useConverter(s -> Integer.parseInt(s));//引用類方法useConverter(Integer::parseInt);//Lambda表達式被類方法替代的時候,它的形式參數全部傳遞給靜態方法作為參數}private static void useConverter(Converter c){int num = c.converter("1998");System.out.println(num);}}public interface Converter {int converter(String s);}2.5 引用對象的實例方法
引用對象的實例方法,其實就是引用類中的成員方法 格式: 對象::成員方法 范例: "HelloWorld"::toUpperCase String類中的方法: public String toUpperCase 將此String所有的字符轉換成大寫 練習:public class PrinterDemo {public static void main(String[] args) {//用Lambda表達式實現usePrinter(s -> System.out.println(s.toUpperCase()) );//引用對象的實例方法PrintString ps = new PrintString();usePrinter(ps::PrintUpper);//Lambda表達式 被對象的實例方法替代的時候,它的形式參數全部傳遞給該方法作為參數}private static void usePrinter(Printer p){p.printUpperCase("HelloWorld");}}public class PrintString {public void PrintUpper(String s) {String result = s.toUpperCase();System.out.println(result);}}public interface Printer {void printUpperCase(String s);}2.6 引用類的實例方法
引用類的實例方法,其實就是引用類的成員方法 格式: 類名::成員方法 范例: String::substring String類中的方法: public String substring(int begin,int end) 從begin開始到end結束 截取字符串,返回一個字串,字串的長度位end-begin 練習:public class MyStringDemo {public static void main(String[] args) {//Lambda表達式 調用String類中的substring來實現useMyString((s,x,y) -> s.substring(x,y));//引用類中的實例方法useMyString(String::substring);//Lambda表達式被類的實例方法替代的時候//第一個參數作為調用者//后面的參數全部傳遞給該方法作為參數}private static void useMyString(MyString my){String s = my.mysubString("HelloWorld",2,5);System.out.println(s);}}public interface MyString {String mysubString(String s,int x,int y);}2.7 引用構造器
引用構造器,其實就是引用構造方法 格式: 類名::new 范例: Student::new 練習:public class StudentDemo {public static void main(String[] args) {//Lambda表達式useStudentBuilder((name,age) -> new Student(name,age) );//方法引用 引用構造器useStudentBuilder(Student::new);//Lambda表達式被構造器替代的時候,它的形式參數全部傳遞給構造器作為參數}private static void useStudentBuilder(StudentBuilder sb){Student s = sb.build("fzz", 21);System.out.println(s.getName()+","+s.getAge());}}省略Student類 一個name,一個age,兩個構造(無參、帶參),成員各自的get,setpublic interface StudentBuilder {Student build(String name,int age);}總結
以上是生活随笔為你收集整理的JavaSE学习18(接口组成更新,方法引用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Latex排版常用命令
- 下一篇: LaTeX 排版(一)——基础应用