❶ java中介面、介面的實現和多態的問題
沒錯,這就是多態。介面實現的多態,意味著介面UserService負責定義方法的名字,形參列表和返回值,而不考慮其具體實現,調用方UserBlh也不必了解findUser,saveOrUpdate這兩方法由誰來實現,只需知道這userService指針指向的對象已經實現了這兩個方法,那麼調用方UserBlh只管調用就好。
「調用的是介面UserService中對應的方法,還是調用的是介面的實現UserServiceImpl中對應的方法」看來你可能不太清楚在實現層(語言編譯的技術)上如何做的。
具體來說,1.方法實際上就是一段可執行的代碼。而介面UserService其實就是定義了一個數據結構(其實就是虛函數表),而不定義方法本身(就是介面沒有定義可執行的代碼塊)
2.介面UserService的子類UserServiceImpl在構造函數里要往這個表填一些東西,這個東西就是子類UserServiceImpl所定義的可執行代碼塊的入口地址。
3.當調用方UserBlh調用findUser方法,則通過查虛函數表的方式找到那個findUser方法的地址,進行調用。
給張圖幫助說明從技術的角度如何實現多態。(假設還有一個類B也實現了介面UserService)
❷ Java常見的面試問題(帶答案),自己答出來多少
1、在java中如果聲明一個類為final,表示什麼意思?
答:final是最終的意思,final可用於定義變數、方法和類但含義不同,聲明為final的類不能被繼承。
父類的構造方法是否可以被子類覆蓋(重寫)?
答:父類的構造方法不可以被子類覆蓋,因為父類和子類的類名是不可能一樣的。
2、請講述String 和StringBuffer的區別。
答:String 類所定義的對象是用於存放」長度固定」的字元串。
StringBuffer類所定義的對象是用於存放」長度可變動」的字元串。
3、如果有兩個類A、B(注意不是介面),你想同時使用這兩個類的功能,那麼你會如何編寫這個C類呢?
答:因為類A、B不是介面,所以是不可以直接繼承的,但可以將A、B類定義成父子類,那麼C類就能實現A、B類的功能了。假如A為B的父類,B為C的父類,此時C就能實現A、B的功能。
4、談談你對抽象類和介面的理解。
答:定義抽象類的目的是提供可由其子類共享的一般形式、子類可以根據自身需要擴展抽象類、抽象類不能實例化、抽象方法沒有函數體、抽象方法必須在子類中給出具體實現。他使用extends來繼承。
介面:一個介面允許一個類從幾個介面繼承而來,Java 程序一次只能繼承一個類但可以實現幾個介面,介面不能有任何具體的方法,介面也可用來定義可由類使用的一組常量。其實現方式是interface來實現。
5、Java中什麼是競態條件?
答:競態條件會導致程序在並發情況下出現一些bugs。多線程對一些資源的競爭的時候就會產生競態條件,如果首先要執行的程序競爭失敗排到後面執行了,那麼整個程序就會出現一些不確定的bugs。這種bugs很難發現而且會重復出現,因為線程間的隨機競爭。
6、Java中如何停止一個線程?
答:Java提供了很豐富的API但沒有為停止線程提供API。JDK 1.0本來有一些像stop(), suspend() 和 resume()的控制方法但是由於潛在的死鎖威脅因此在後續的JDK版本中他們被棄用了,之後Java API的設計者就沒有提供一個兼容且線程安全的方法來停止一個線程。當run() 或者 call() 方法執行完的時候線程會自動結束,如果要手動結束一個線程,你可以用volatile 布爾變數來退出run()方法的循環或者是取消任務來中斷線程。點擊這里查看示例代碼。
7、 一個線程運行時發生異常會怎樣?
答: 簡單的說,如果異常沒有被捕獲該線程將會停止執行。Thread.UncaughtExceptionHandler是用於處理未捕獲異常造成線程突然中斷情況的一個內嵌介面。當一個未捕獲異常將造成線程中斷的時候JVM會使用Thread.getUncaughtExceptionHandler()來查詢線程的UncaughtExceptionHandler並將線程和異常作為參數傳遞給handler的uncaughtException()方法進行處理。
❸ java介面和實例化的問題。
介面是更加抽象的抽象類,抽象類里的方法可以有方法體,介面里的所有方法都沒有方法體。介面體現了程序設計的高內聚低耦合和多態的設計思想。另外,Java中繼承都是單繼承的,對子類的功能擴展有一定的影響,介面可以看做是對繼承的一種補充。實現介面,可在不打破繼承關系的前提先,對某個類功能擴展,非常靈活。
public class InterfaceTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Computer computer=new Computer();
Camera camera=new Camera();
Phone phone=new Phone();
computer.play(camera);
computer.play(phone);
}
}
interface Usb
{
public void start();
public void stop();
}
class Camera implements Usb
{
public void start()
{
System.out.println("相機開始工作");
}
public void stop()
{
System.out.println("相機停止工作");
}
}
class Phone implements Usb
{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("手機開始工作");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("手機停止工作");
}
}
class Computer
{
public void play(Usb usb)
{
usb.start();
usb.stop();
}
}