抽象類與介面詳解與對比
前言:記錄自己在工作中遇到的小問題,積少成多!因為是新手,有什麼寫的不好的地方還希望大家指出來。有什麼更好的方法也希望大家能夠提出來,一起交流學習。(小弟先在這裡謝謝大家)
正文:
一、介面介紹:
1、介面概述
介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法!這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情!
2、介面的定義:
[修飾符] interface 介面名稱 extends 介面1,介面2...... {
方法1(){};
方法2(){};
}
修飾符:可選,用於指定介面的訪問許可權;
介面名稱:必選,用於指定介面的名稱,介面名稱必須符合Java標識規範,一般首字元要求大寫;
extends:可選,用於指定繼承的父介面名稱(介面可多和繼承);
方法:介面中的只有定義而沒有實現;
下面為一個介面的定義例子:
public interface CalInterface{
public final float PI=3.14159f;//定義用於表示圓周率的常量PI
public float getArea(float r);//定義一個用於計算面積的方法getArea()
float getCircumference(float r);//定義一個用於計算周長的方法getCircumference()
}
3、介面的實現:
[修飾符] class 類名稱 [繼承 父類名稱] [implements 介面列表]{
方法1(){};
方法2(){};
}
修飾符:可選,用於指定類的訪問許可權;
類名:必選,用於指定類的名稱,類名稱必須符合Java標識規範,一般首字元要求大寫;
extends:可選,用於指定繼承的父類(超類)名稱(類只能單繼承);
implements:可選,用於指定該類實現的介面名稱(可多實現,介面與介面之間用“,”分割);
下面為一個介面實現的例子:
public class Cire implements CalInterface{ public float getArea(float r){ float area=PI*r*r;//計算圓面積並賦值給變數area return area;//返回計算後的圓面積 } public float getCircumference(float r){ float circumference=2*PI*r; //計算圓周長並賦值給變數circumference return circumference; //返回計算後的圓周長 } public static void main(String[] args){ Cire c = new Cire(); float f = c.getArea(2.0f); System.out.println(Float.toString(f)); } }
4、介面注意事項;
①、一個介面可以繼承多個介面:
interface C extends A,B{} 這樣寫是可以的
(注意:一個類只能繼承一個類,類是單繼承!但是可以寫成A繼承B,B繼承C,這樣A就同時可以用B和C裡面的方法)
②、一個類可以實現多個介面:
class C implements A,B{} 這樣寫是可以的
③、類在繼承類的同時,也可以實現介面
二、抽象類介紹
1、抽象類概述:
抽象類是用來捕捉子類通用特性的。它不能被例項化,只能被用作子類的超類。抽象類是用來建立繼承層級裡子類的模板!
2、抽象類的定義:
[修飾符] abstract [類名] [extends 抽象類]{
方法1(){};
方法2(){};
}
修飾符:可選,用於指定抽象類的訪問許可權;
類名:必選,用於指定抽象類的名稱,類名必須符合Java標識規範,一般要求首字母大寫;
extends:可選,用於指定該類繼承的抽象類名稱(單繼承);
下面為一個抽象類的兩個例子:
abstract class A { // 定義抽象類a
public static final String FLAG = "CHINA";
private String name = "張三";
public String getName() {// 取得name的值
return name;
}
public void setName(String name) { // 設定name值
this.name = name;
}
public abstract void print(); // 宣告抽象方法
}
class B extends A { // B繼承A
public void print() { // 覆寫A類的print方法
System.out.println("FLAG=" + FLAG);
System.out.println("姓名=" + super.getName());
}
}
public class AbstractDemo02 {
public static void main(String args[]) {
B b = new B(); // 初始化B類
b.print(); // 呼叫B類的orint()方法
}
}
結果:
FLAG=CHINA
姓名=張三
//抽象類的宣告
abstract class Animal {
String type;
String name;
int age;
int weight;
void eat() {
System.out.println("動物愛吃飯");
}
//抽象方法在抽象類中只能宣告,不能具體實現
abstract void breath();
void sleep() {
System.out.println("動物在睡覺");
}
}
//由子類去繼承父類抽象類
class tiger extends Animal{
@Override
//在此處實現抽象方法
void breath() {
// TODO Auto-generated method stub
System.out.println("老虎在呼吸");
}
}
public class first_for {
public static void main(String [] args){
// 錯誤,程式會報錯
//報錯原因:抽象類不能進行例項化操作
//Animal Tiger = new Animal();
//只能用子類進行例項化
Animal Tiger = new tiger();
Tiger.breath();
}
}
結果:老虎在呼吸
3、抽象類注意事項:
①抽象類裡面的方法不一定是抽象方法,但是含有抽象方法的類,一定是抽象類;
②抽象方法在抽象類中只能宣告,不能具體實現;
③由子類去繼承父類的抽象類;
④子類繼承父類以後,必須實現其父類(超類)抽象方法
⑤抽象方法不能進行例項化操作;
⑥只能用子類進行例項化;