java的接口為什么不能實例化呢?首先,我們需要明白實例化的含義。實例化實際意義是在jvm的堆中開辟出一塊內存空間,比如Student s = new Student();此處聲明Student對象s,並且實例化一個Student對象,實則是在堆中開辟出一塊空間來存放Student對象,s則是指向這塊空間,也就是內存中的一塊地址。這塊地址中所存放的值就是我們這個Student對象的一些屬性。
具體類所占用的內存空間(也就是堆里的一塊地址)所存放的值是類的成員變量,這里插入一張圖便於我們理解:

圖中可以看到,棧中存放的是per,值是堆中具體Person這個對象的地址,也就是per指向這個具體類的引用。而堆中一塊地址,存放的值是Person這個類的成員變量(局部變量在執行時存放在棧中)。
那么換做一個接口呢?假設我們可以new出一個接口,那么這個接口就會占用堆中的一塊地址,那么我們想想接口的這塊地址上能夠存放什么值呢。
說到這個首先要清楚接口中允許有什么:靜態的屬性以及方法聲明。這里再說明下,java的內存空間分為四類:棧(stack)、堆(heap)、代碼(code)、靜態數據(data)。由此可見接口中所有的東西的具體值都是存放在代碼去和靜態數據區的,所以接口的這塊地址上並沒有任何實際的值需要存儲,那么為什么要給他一塊地址來浪費空間呢。其實用底層代碼在內存中開辟出一塊空間很容易,那么為什么java設定不允許接口實例化呢,以我的理解而言,那就是接口的實例化沒有任何實際意義,只會占用一塊內存空間,卻不會在這塊空間中放任何實際的值,所以java主動去規避掉了這個問題。
