1. 程式人生 > >Java第九天學習筆記~繼承、抽象類、介面

Java第九天學習筆記~繼承、抽象類、介面

子類的例項化過程

子類中所有的建構函式預設都會訪問父類中空引數的建構函式。
因為每一個建構函式的第一行都有一條預設的語句super();。
子類會具備父類中的資料,所以要先明確父類是如何對這些資料初始化的。

為什麼子類例項化的時候要訪問父類中的建構函式呢?
那是因為子類繼承了父類,獲取到了父類中內容(屬性),所以在使用父類內容之前,要先看父類是如何對自己的內容進行初始化的。

class Fu
{
    Fu(){
        super();
//呼叫的是子類的show方法,此時其成員變數 num還未進行顯示初始化
        show();
        return;
        }
    void show()
        {
    System. out.println("fu show" );
        }
}
class Zi extends Fu
{
         int num = 8;
        Zi()
        {
        super();
//通過super初始化父類內容時,子類的成員變數並未顯示初始化,等super()父類初始化完畢後,才進行子類的成員變數顯示初始化
        return;
        }
void show()
        {
    System. out.println("zi show..." + num);
        }
}
class ExtendDemo
    {
public static void main(String[] args)   
        {
Zi z = new Zi();
z.show();
        }
}

總結:
一個物件例項化過程,以Person p = new Person();為例:
1、JVM會讀取指定的路徑下的Person.class檔案,並載入進記憶體,並會先載入Person的父類(如果有直接的父類的情況下)。
2、在記憶體中開闢空間,並分配地址。
3、並在物件空間中,對物件的屬性進行預設初始化。
4、呼叫對應的建構函式進行初始化。
5、在建構函式中,第一行會先到呼叫父類中建構函式進行初始化。
6、父類初始化完畢後,再對子類的屬性進行顯示初始化。
7、再進行子類建構函式的特定初始化。
8、初始化完畢後,將地址值賦值給引用變數。

final關鍵字

class Fu
{
	void method()
    {
    }
}
 
class Zi extends Fu
{
	public static final double PI = 3.14;
	void method()
	{
	System. out.println(PI);
	}	
}
 
class FinalDemo
{
	public static void main(String[] args)
	{
	Zi zi = new Zi();
	zi.method();
	}

}

final可以修飾類,方法,變數。
final修飾的類不可以被繼承。
final修飾的方法不可以被覆蓋。
final修飾的變數是一個常量,只能被賦值一次

抽象類
 

抽象類中是否有建構函式?
答:有,用於給子類物件進行初始化。

抽象關鍵字abstract不可以和哪些關鍵字共存?
答:private、static、final。

抽象類中可不可以沒有抽象方法?
答:可以,但是很少見。目的就是不讓該類建立物件,AWT的介面卡物件就是這種類。通常這個類中的方法有方法體,但是卻沒有內容。
 

抽象類和一般類的區別?
答:
相同點:
抽象類和一般類都是用來描述事物的,都在內部定義了成員。
不同點:
①一般類有足夠的資訊描述事物。
抽象類描述事物的資訊有可能不足。
②一般類中不能定義抽象方法,只能定義非抽象方法。
抽象類中可定義抽象方法,同時也可以定義非抽象方法。
③一般類可以被例項化。
抽象類不可以被例項化。

抽象類一定是個父類嗎?
答:是的,因為需要子類覆蓋其方法後才可以對子類例項化

介面

當一個抽象類中的方法都是抽象的時候,這時可以將該抽象類用另一種形式定義和表示,就是介面。

格式:interface {}

介面中的成員修飾符是固定的:
成員常量:public static final
成員函式:public abstract
由此得出結論,介面中的成員都是公共的許可權。

介面是對外暴露的規則。
介面是程式的功能擴充套件。

interface Demo
	{
	public static final int NUM = 4;
	public abstract void show1();
	public abstract void show2();
	}
 
class DemoImpl implements /*實現*/Demo
	{
	public void show1(){}
	public void show2(){}
	}
 
class InterfaceDemo
{
	public static void main(String[] args)
	{
	DemoImpl d = new DemoImpl();
	System. out.println(d.NUM);
	System. out.println(DemoImpl.NUM);
	System. out.println(Demo.NUM);
	}
}

注意:

  1. ①雖然抽象類中的全域性變數和抽象方法的修飾符都可以不用寫,但是這樣閱讀性很差。所以,最好寫上。
  2. ②類與類之間是繼承關係,類與介面直接是實現關係。
  3. ③介面不可以例項化,只能由實現了介面的子類並覆蓋了介面中所有的抽象方法後,該子類才可以例項化。否則,這個子類就是一個抽象類。