1. 程式人生 > >老生常談——抽象類和介面異同

老生常談——抽象類和介面異同

     今天是在這個公司的最後一天,外面下著雨,跟我心情一樣!雖然不是什麼大公司,但是跟同事的感情還是不錯的。革命尚未成功,同志仍需努力!未來的路還很長,所以時刻準備著迎接新的挑戰!為了我所心愛的人,不斷努力,不斷奮鬥,永不停息前進的腳步!

    因為交接工作基本完成,所以這幾天一直在等放假!閒來無事,就看看java基礎。看到抽象類和介面的知識點時,突然想起自己當年在面試過程中遇到過。細細想想有些問題模糊不清,所以根據俄自己的理解,寫了個關於抽象類和介面的比較的例子。希望能對初學者有些幫助。由於本人能力有限,寫的不足之處希望大家能夠諒解!嘿嘿!有點扯多了,書歸正傳!

1、抽象類(abstract class)

  • 抽象類和抽象方法都是由abstract進行修飾的。
  • 抽象類不能夠進行例項化。
  • 抽象方法只能宣告,不能進行實現。也就是說沒有方法體。
  • 含有抽象方法的類必須是抽象類。
  • 繼承抽象類的子類,必須實現所有抽象類中的方法,否則這個子類依然是抽象類。

2、介面(interface)

  • 所有方法都是抽象的。只能宣告,不能進行實現。
  • 所有變數都是常量。

值得注意的是,有些面試的時候會出一些挑錯的題。由於在學習時,忽略了一些不常用的知識點,所以在筆試的時候一定要注意細節,介面中是可以宣告變數的,但是必須給這個變數賦值。同時,抽象類是可以存在一般方法的,也可以宣告成員變數。繼承抽象類,除了抽象方法必須重寫之外,也可以對父類中的一般方法進行重寫。

3、例子

Person抽象類:

package com.alex.test;

/**
 * 抽象類
 * @author Alex
 */
public abstract class Person {
	
	public String name;
	public int age; 
	//設定資訊的方法,定義為抽象方法,抽象方法必須在子類中進行實現
	public abstract void setInfo(String name,int age);
	//定義了一個一般方法
	public void getInfo() {
		System.out.println("名字是:" + this.name);
		System.out.println("年齡是:" + this.age);
	}
}

 醫生子類Doctor:

package com.alex.test;

/**
 * 醫生子類類
 * @author Alex
 */
public class Doctor extends Person {
	/**
	 * 實現setInfo方法,這個是Person抽象類的方法
	 */
	@Override
	public void setInfo(String name,int age) {
		super.age = age;
		super.name = name;
	}
}

 測試類:

package com.alex.test;

/**
 * 測試類
 * @author Alex
 */
public class Test {

	public static void main(String[] args) {
		Doctor doctor = new Doctor();
		doctor.setInfo("Doctor",20);
		doctor.getInfo();
	}
}

然後新增一個Profession介面。同時,Doctor類實現這個介面,並繼承Person抽象類。

Profession介面:

package com.alex.test;

/**
 * 職業介面
 * @author Alex
 */
public interface Profession {
	//在介面中定義變數的話,預設就是public static final修飾,也就是說介面中的成員變數都是常量
	String professionName = "醫生";
	public void getProfessionName();   
}

Doctor類:

package com.alex.test;
/**
 * 醫生實現類
 * @author Alex
 */
public class Doctor extends Person implements Profession {

	/**
	 * 實現setInfo方法,這個是Person抽象類的方法
	 */
	@Override
	public void setInfo(String name, int age) {
		super.name = name;
		super.age = age;
	}

	/**
	 * 實現getProfessionName方法,這個是Profession介面的方法
	 */
	@Override
	public void getProfessionName() {
		//因為professionName是常量,所以使用類名.變數名方式引用
		System.out.println("職業是:" + Profession.professionName);
	}
}

在測試類中增加一行程式碼:

doctor.getProfessionName();

執行之後的結果就可以看到:

名字是:Doctor
年齡是:20
職業是:醫生

本篇博文內容比較基礎,希望大家多多包涵!