生活随笔
收集整理的這篇文章主要介紹了
Java面试知识点:多态、内部类
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題:Java面試知識點:多態、內部類
答案:
多態中成員訪問特點
? 構造方法:同繼承一樣,子類會通過super訪問父類構造方法
? 成員變量:編譯看左邊(父類),執行看左邊(父類)
? 成員方法:編譯看左邊(父類),執行看右邊(子類)
多態中的轉型
? 向上轉型
? ?從子到父
? ?父類引用指向子類對象
? 向下轉型
? ?從父到子
? ?父類引用轉為子類對象
避免強轉出現的問題
?關鍵字 instanceof
?使用格式:
? ? 變量名 instanceof 類型
? ? 通俗的理解:判斷關鍵字左邊的變量,是否是右邊的類型,返回boolean類型結果
內部類:
成員內部類
成員內部類,也屬于(成員),既然是成員就可以被一些修飾符所修飾
? private
? ? 私有成員內部類訪問:在自己所在的外部類中創建對象訪問。
? static
? ? 靜態成員內部類訪問格式:外部類名.內部類名對象名=new外部類名.內部類名();
? ? 靜態成員內部類中的靜態方法:外部類名.內部類名.方法名();
匿名內部類
概述:匿名內部類本質上是一個特殊的局部內部類(定義在方法內部) 前提:需要存在一個接口或類
格式:
? ? ?new類名或者接口名。{ 重寫方法;
? ? ?);
package com.xy;/*** @ProjectName: day01* @Package: com.xy* @ClassName: test06* @Author: 楊路恒* @Description:* @Date: 2021/8/12 0012 17:39* @Version: 1.0*/
public class test06 {public static void main(String[] args) {InterIml interIml=new InterIml();interIml.show();/*** 匿名內部類:* 前提:需要存在類、接口* 格式:* new 類名、接口名(){** }*/new Inter(){@Overridepublic void show() {System.out.println("匿名內部類");}}.show();//匿名內部類的理解:將繼承、實現,方法重寫,創建對象,放在了一步進行//解釋:實現了Inter接口的,一個實現類對象Inter1 inter=new Inter1(){@Overridepublic void show() {System.out.println("1");}@Overridepublic void show1() {System.out.println("2");}};inter.show();inter.show1();}
}interface Inter{void show();
}
interface Inter1{void show();void show1();
}
class InterIml implements Inter{@Overridepublic void show() {System.out.println("匿名內部類");}
}
lambda表達式:
Lambda表達式的標準格式
? 方法形式參數為空,說明調用方法時不需要傳遞物
? 方法返回值類型為void ,說明方法執行沒有結果返回
? 方法體中的內容,是我們具體要做的事情
Lambda表達式的代碼分析
? ()?:里面沒有內容,可以看成是方法形式參數為空
? ->?:用箭頭指向后面要做的事情
?? {}:包含一段代碼,我們稱之之為代碼塊,可以看成是方法體中的內容
?組成Lambda表達式的三要素:形式參數,箭頭,代碼塊
Lambda表達式的省略模式
省略規則:
? 參數類型可以省略,但是有多個參數的情況下,不能只省略一個
?如果參數有且僅有一個,那么小括號可以省略
? 如果代碼塊的語句只有一條,可以省略大括號和分號,甚至是return
Lambda表達式和匿名內部類的區別
所需類型不同
? 匿名內部類:可以是接口,也可以是抽象類,還可以是具體類
? Lambda表達式:只能是接口
使用限制不同
? 如果接口中有且僅有一個抽象方法,可以使用Lambda表達式,也可以使用匿名內部類
? 如果接口中多于一個抽象方法,只能使用匿名內部類,而不能使用Lambda表達式
實現原理不同
? 匿名內部類:編譯之后,產生一個單獨的.class字節碼文件
? Lambda表達式:編譯之后,沒有一個單獨的.class字節碼文件。對應的字節碼會在運行的時候動態生成
package com.xy;import java.util.Random;/*** @ProjectName: day01* @Package: com.xy* @ClassName: test07* @Author: 楊路恒* @Description:* @Date: 2021/8/13 0013 12:31* @Version: 1.0*/
public class test07 {public static void main(String[] args) {useShowHandler(new ShowHandler() {@Overridepublic void show() {System.out.println("匿名內部類");}});useShowHandler(() -> {System.out.println("lambda");});useStringHandler(new StringHandler() {@Overridepublic void printMessage(String msg) {System.out.println("匿名內部類" + msg);}});useStringHandler((String msg) -> {System.out.println("lambda");});useRandomNumHandler(new RandomNumHandler() {@Overridepublic int getNumber() {Random random = new Random();int number = random.nextInt(10) + 1;return number;}});useRandomNumHandler(() -> {Random random = new Random();int number = random.nextInt(10) + 1;return number; //如果lambda所操作的接口中的方法有返回值,一定要通過return語句,將結果返回});useCalculator(new Calculator() {@Overridepublic int calc(int a, int b) {return a+b;}});useCalculator((int a,int b)->{return a+b;});}public static void useShowHandler(ShowHandler showHandler) {showHandler.show();}public static void useStringHandler(StringHandler stringHandler) {stringHandler.printMessage("6");}public static void useRandomNumHandler(RandomNumHandler randomNumHandler) {int number = randomNumHandler.getNumber();System.out.println(number);}public static void useCalculator(Calculator calculator){int calc = calculator.calc(6, 66);System.out.println(calc);}
}interface ShowHandler {public void show();
}interface StringHandler {public void printMessage(String msg);
}interface RandomNumHandler {public int getNumber();
}interface Calculator{public int calc(int a,int b);
}
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Java面试知识点:多态、内部类的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。