抽象類實際上也是一個類,隻是與之前的普通類相比,在抽象類中多了抽象方法。
抽象方法是隻聲明而未實作的方法,所有的抽象方法必須使用abstract關鍵字聲明,包含抽象方法的類也必須使用abstract class聲明。
一個抽象類的定義
abstract class A{
private String name = "WWW" ;
public void fun(){
// 此處定義了一個普通方法
System.out.println("Hello World!!!") ;
}
<b>public abstract void print() ;</b>
};
可以發現抽象方法後面沒有“{}”,則表示方法沒有實作。
如果對抽象方法直接執行個體化,則會出現無法執行個體化的錯誤。
public abstract void print() ;
public class Demo01{
public static void main(String args[]){
<b>A a = new A() ;</b>
<b>抽象類的使用原則:</b>
1、 抽象類必須有子類,抽象類必須被繼承
2、 抽象類的子類如果不是抽象類的話,則必須覆寫裡面的全部抽象方法。
3、 抽象類不能直接執行個體化,必須依靠子類完成。
進一步完善之前的程式:
class B extends A{
// 覆寫抽象方法
public void print(){
System.out.println("**********************") ;
public class Demo02{
B b = new B() ;
b.print() ;
b.fun() ;
<b>讨論問題:</b>
1、 能否用final修飾一個抽象類呢?
· 因為抽象類必須被子類繼承,而被final修飾的類不能有子類。是以不能
2、 抽象類中能否有構造方法呢?可以有
abstract class Person{
private String name ;
private int age ;
// 單獨按一個類來說,應該可以直接在構造方法中初始化
<b> public Person(String name,int age){</b>
<b> this.name = name ;</b>
<b> this.age = age ;</b>
<b> }</b>
public abstract String getInfo() ;
public String getName(){
return this.name ;
public int getAge(){
return this.age ;
class Student extends Person{
private String school ;
public Student(String name,int age,String school){
<b>super(name,age) ;</b>
this.school = school ;
public String getInfo(){
return "姓名:"+super.getName()+",年齡:"+super.getAge()+",學校:"+this.school ;
public class Demo03{
Student stu = new Student("張三",30,"北京大學") ;
System.out.println(stu.getInfo()) ;
抽象類中可以有構造方法,但是要求在沒有無參構造方法的時候,子類必須明确的調用父類中的構造方法。
<b>回顧:</b>子類對象的執行個體化過程
· 子類對象執行個體化的時候預設會先去調用父類中的無參構造方法,如果父類中沒有無參構造,則可以通過super指定調用父類中的其他構造方法。
<b>注意:</b>
一個類隻可以繼承一個抽象類,屬于單繼承。
<b> </b><b>接口定義:</b>
· 隻包含抽象方法和全局常量的類稱為接口。
· 接口使用interface進行定義。
interface A{
public static final String INFO = "HELLO" ;
}
接口定義完之後,一個接口也必須依靠其子類使用,子類繼承接口的概念稱為實作。格式如下:
class 子類 implements 接口名稱{}
接口的子類如果不是抽象類的話,則也必須覆寫裡面的全部抽象方法。
class B implements A{
System.out.println(INFO) ;
public class Demo04{
接口與抽象類相比,有一個優點:說一個子類隻能繼承一個父類,但是可以同時實作多個接口,也就說是通過接口完成多繼承。
class 子類 implements 接口A,接口B
interface C{
public static final String PARAM = "WWW" ;
public abstract void fun() ;
class B implements A,C{
System.out.println(PARAM) ;
public class Demo05{
<b>問題:</b>
既然,接口中的一切方法都是抽象方法,接口中的一切變量都是全局常量,那麼實際上接口就可以簡化成如下的形式定義。
// public static final String INFO = "HELLO" ;
String INFO = "HELLO" ;
// public abstract void print() ;
void print() ; //à 此處雖然沒有明确的寫出權限,但實際上權限是<b>public</b>
一定要明确:接口中的一切方法都是public通路權限,是以在子類實作方法的時候通路權限必須是public。寫與不寫是一樣的。是以有時候為了避免此種情況,還是建議寫上:public
<b>public void print() ;</b>
那麼如果一個類繼承繼承一個抽象類又要實作一個接口,則必須按照以下格式完成:
class 子類 extends 父類(一般都是抽象類) implements 接口A,接口B
void print() ;
abstract class X{
public String param = "hello" ;
abstract void fun() ;
class B extends X implements A{
void fun(){
System.out.println(param) ;
public class Demo07{
<b> </b>
<b>開發原則:</b>
在開發中一定要記住,一個類往往很少去繼承一個已經實作好的類,即:普通類之間不能互相繼承。
<b>注意點:</b>
1、 一個抽象類可以實作多個接口,但是一個接口不能繼承一個抽象類。
<b>abstract class X implements A</b>{
2、 一個接口可以同時繼承多個接口,即:實作多繼承關系
interface 子接口 extends 父接口A,父接口B,父接口C
public void printA() ;
interface B{
public void printB() ;
public void printC() ;
interface X extends A,B,C{
public void printX() ;
class Y implements X{
public void printA(){}
public void printB(){}
public void printC(){}
本文轉自 李興華 51CTO部落格,原文連結:http://blog.51cto.com/lixinghua/91243,如需轉載請自行聯系原作者