一、抽象方法不可以寫出大括號
在Java編程語言中,抽象方法可以看作是一種沒有具體實現的方法,只有方法聲明而沒有方法體。在使用抽象方法的時候,我們往往會犯一種錯誤,那就是試圖給抽象方法加上一個大括號來定義方法體。這是不符合語法規則的,因為抽象方法不可以有方法體。
abstract class Shape { public abstract void draw() {}; // 報錯:不能為抽象方法的大括號提供實現 }
上述代碼中,我們試圖為抽象方法draw()加上一個大括號,使其具有方法體,但實際上這是錯誤的,編譯器會報錯。
二、聲明抽象方法要寫大括號嘛
當我們定義具體的實現類時,必須要實現抽象類中聲明的所有抽象方法。在這個過程中,我們可以選擇是否為抽象方法添加一個大括號。這個問題的答案是:如果你想讓這個方法是一個抽象方法,則不需要寫大括號;如果你想讓這個方法具有具體實現,則必須寫大括號。
abstract class Shape { public abstract void draw(); // 定義一個抽象方法 } class Circle extends Shape { public void draw() { System.out.println("draw a circle"); } } class Square extends Shape { public void draw() { // 不想給具體實現,讓其仍然是一個抽象方法 } }
在上述示例中,我們定義了一個抽象類Shape,並且定義了一個抽象方法draw()。在具體實現類Circle中,我們為draw()添加了具體實現,所以必須添加大括號。而在具體實現類Square中,我們並沒有為draw()添加具體實現,所以draw()仍然是一個抽象方法,不需要添加大括號。
三、聲明抽象方法大括號可有可無
在Java 8中,還引入了一種新的語法:函數式接口。在函數式接口中,可以使用lambda表達式來代替原來需要具體實現的抽象方法,因此不需要加上大括號。
@FunctionalInterface interface MyFunc { int apply(int a, int b); } class Test { public static void main(String[] args) { MyFunc add = (a, b) -> a + b; MyFunc mul = (a, b) -> { return a * b; }; } }
在上述代碼中,我們定義了一個函數式接口MyFunc,其中只包含一個抽象方法apply(),它需要返回兩個整數的和。在使用lambda表達式創建add和mul時,我們可以看到,在add中不需要大括號,因為它只需要一個簡單的表達式a+b來完成計算;而在mul中,我們需要使用大括號來明確表達式的結構,並且需要使用return語句來返回計算結果。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254859.html