Java介面的作用和抽象類別的區別

來源:互聯網
上載者:User

在面試可能經常被問到,介面有什麼作用?相對於類而言,為何需要用類實現介面等等諸如此類的問題。如果不仔細想想,有時候還會卡住。這篇文章將簡單介紹下介面的作用。 
對於介面而言,就是用來標記類的一個產物。每個介面都對應有一個或多個實現它的類,否則這個介面就成為冗餘代碼。因為管理介面比管理類要簡單挺多,介面就由此體現了抽象的觀點。換句話說,介面就是沒有屬性和行為實現的類。類實現多個介面,可以解決類不能繼承多個類的機制。那麼介面該怎麼使用呢? 
一 介面的作用 
下面有兩個方面: 
1. Java多態介面動態載入執行個體 
這種實現方式,大家在很多場合下都可以見到。下面介紹一個Sample: 
1) 介面類: 

public interface PersonService {/** * 計算每月的工資 *  sal:工資基數 *  type:員工等級 */public double calcuMonthlySalary(double sal, int type);}

  

2) 實作類別: 

public class ManagerServiceBean implements PersonService {/** *  */public ManagerServiceBean() {}/* (non-Javadoc) * @see com.java.test.Interface.PersonService#calcuMonthlySalary(double, int) */public double calcuMonthlySalary(double sal, int type) {System.out.println("ManagerServiceBean: "+(sal*type*2));return sal*type*2;}}public class EmployeeServiceBean implements PersonService {/** *  */public EmployeeServiceBean() {}/* (non-Javadoc) * @see com.java.test.Interface.PersonService#calcuMonthlySalary(double, int) */public double calcuMonthlySalary(double sal, int type) {System.out.println("EmployeeServiceBean: "+(sal*type*2));return sal*type*1.5;}}}

  

3) 測試類別: 

public class SalaryManageTest {/** * @param args */public static void main(String[] args) throws Exception{try{//這裡寫得不智能,還需要傳入傳輸PersonService personService = (PersonService)Class.forName(args[0]).newInstance();if (args[1] != null && args[1] != "" &&args[2] != null && args[2] != ""){int sal = Integer.valueOf(args[1]).intValue();int type = Integer.valueOf(args[2]).intValue();//這裡可以根據傳入參數的不同,調用不同的實作類別,//如果再增加一類新的成員,我們也只要新增一個類,無需修改方法personService.calcuMonthlySalary(sal, type);}}catch(Exception ex){ex.printStackTrace();}}}

  

這裡,通過介面在擷取類對象的時候,個人覺得寫得不是很好。。但也許大家用過Ejb的人都應該知道,用戶端擷取Ejb bean的時候,就是通過這種方式擷取:

Java代碼

PersonService personService = (PersonService)context.lookup(“personServiceBean/remote”);

  

2. Java介面作為參數傳遞 
下面列出一個Sample: 
1) 介面,實作類別同上。 
2) Person實體類: 

public class Person {private double sal;private int type;/** *  */public Person() {}/** * @param sal * @param type */public Person(double sal, int type) {this.sal = sal;this.type = type;}/** * @return the sal */public double getSal() {return sal;}/** * @param sal the sal to set */public void setSal(double sal) {this.sal = sal;}/** * @return the type */public int getType() {return type;}/** * @param type the type to set */public void setType(int type) {this.type = type;}}

  

3) 介面作為參數傳入類: 

 public class SalaryManager {/** *  */public SalaryManager() {}public void getMonthlySalary(PersonService personService, Person person){personService.calcuMonthlySalary(person.getSal(), person.getType());}}

  

4) 測試類別: 

public class SalaryManageTest {/** * @param args */public static void main(String[] args) throws Exception{try{ManagerServiceBean managerServiceBean = new ManagerServiceBean();EmployeeServiceBean employeeServiceBean = new EmployeeServiceBean();SalaryManager salaryManager = new SalaryManager();//call 介面作為傳入參數的實作類別方法salaryManager.getMonthlySalary(managerServiceBean, new Person(1000, 7));salaryManager.getMonthlySalary(employeeServiceBean, new Person(1000, 4));}catch(Exception ex){ex.printStackTrace();}}}

  

二  介面與抽象類別的區別 
   我個人認為有以下幾點: 
   1.abstract class 在 Java 語言中表示的是一種繼承關係,一個類只能使用一次繼承關係。但是,一個類卻可以實現多個interface。這彌補了類的多繼承問題。 

  2.在abstract class 中可以有自己的資料成員,也可以有非abstarct的成員方法,而在interface中,只能夠有靜態不能被修改的資料成員(也就是必須是static final的,不過在 interface中一般不定義資料成員),所有的成員方法都是abstract的。 

  3.abstract class和interface所反映出的設計理念不同。其實abstract class表示的是"is-a"關係,interface表示的是"like-a"關係。 注意:當一個行為與一個類的所屬行為方法不相關聯時,應該採用介面來實現這個行為,不能使用抽象類別,否則違反物件導向的ISP(Interface Segregation Principle)規則和OCP原則. 

  4.實現抽象類別和介面的類必須實現其中的所有方法。抽象類別中可以有非抽象方法。介面中則不能有實現方法。 

  5.介面中定義的變數預設是public static final 型,且必須給其初值,所以實作類別中不能重新定義,也不能改變其值。當然,變數定義也可以是friendly. 

  6.抽象類別中的變數預設是 friendly 型,其值可以在子類中重新定義,也可以重新賦值。 

  7.介面中的方法預設都是 public,abstract 類型的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.