Java介面為什麼不能例項化
Thread t = new Thread(new Runnable(){
@Override
public void run(){
...
}
})
介面不能例項化,Runnable是一個介面,此處不是用new來例項化了嗎?這個其實就是一個假象的例項化而已,這種叫做匿名內部類,實質的程式碼等同於如下程式碼:
class MyThread implements Runnable{
@Override
public viod run(){
...
}
}
//另一個類的main方法中
Thread t = new Thread(new MyThread());
只是上面的程式碼省略掉了類的名字而已。
Java介面為什麼不能例項化呢?例項化實際意義是在jvm的堆中開闢出一塊記憶體空間,比如Person per = new Person();此處宣告 Person 物件 per,並且例項化一個 Person 物件,實則是在堆中開闢出一塊空間來存放 Person 物件,per則是指向這塊空間,也就是記憶體中的一塊地址。這塊地址中所存放的值就是我們這個 Person 物件的一些屬性。
具體類所佔用的記憶體空間(也就是堆記憶體)所存放的值是類的成員變數,見下圖:
圖中可以看到,棧中存放的是per,值是堆中具體 Person 這個物件的地址,也就是 per 指向這個具體類的引用。而堆中一塊地址,存放的值是 Person 這個類的成員變數(區域性變數在執行時存放在棧中)。
那麼換做一個介面呢?假設我們可以 new 出一個介面,那麼這個介面就會佔用堆中的一塊地址,那麼我們想想介面的這塊地址上能夠存放什麼值呢。
說到這個首先要清楚介面中允許有什麼:靜態的屬性以及方法宣告。這裡再說明下,Java的記憶體空間分為四類:棧(stack)、堆(heap)、程式碼(code)、靜態資料(data)。由此可見介面中所有的東西的具體值都是存放在程式碼區和靜態資料區的,所以介面的這塊地址上並沒有任何實際的值需要儲存,那就沒有必要給它一塊地址來浪費空間。其實用底層程式碼在記憶體中開闢出一塊空間很容易,Java之所以設定不允許介面例項化,那就是介面的例項化沒有任何實際意義,只會佔用一塊記憶體空間,卻不會在這塊空間中放任何實際的值。所以Java主動去規避掉了這個問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1916/viewspace-2821765/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 介面到底能不能例項化
- java介面例項Java
- XDoclet為什麼不能生成介面檔案?
- 【物件導向】C# 為什麼用介面例項化一個實現該介面的類?物件C#
- Java技術分享:Lambda表示式之介面例項化Java
- Spring 例項化方式有幾種?為什麼會用到 Cglib?SpringCGLib
- 抽象類是不能被例項化的抽象
- 為什麼類和介面不能使用private和protected?介面的方法不能使用private、protected、default
- 什麼是介面?為什麼使用介面? 什麼時候使用介面?(轉)
- ? python 介面自動化 (二)--什麼是介面測試、為什麼要做介面測試 (詳解)Python
- C# Winform程式介面優化例項C#ORM優化
- 為什麼Vue不能觀察到陣列length的變化?Vue陣列
- Java類初始化和例項化Java
- Android 從原始碼的角度分析——為什麼要用newInstance來例項化FragmentAndroid原始碼Fragment
- 神經網路權值為什麼不能初始化為零(1)神經網路
- 為什麼Java需要物件的序列化Java物件
- java 例項變數初始化Java變數
- Go 介面:nil介面為什麼不等於nil?Go
- 為什麼說.gitignore不能忽視Git
- 伺服器為什麼不能放在公司伺服器
- 為什麼pycharm下不能使用importPyCharmImport
- 為什麼Facebook不能停止使用PHP?PHP
- 為什麼起床後不能收郵件?
- 為什麼不能當職業翻譯
- java中lock介面是什麼Java
- 為什麼要用單例模式?單例模式
- python--介面自動化鑑權例項Python
- 為什麼defineProperty不能檢測到陣列長度的“變化”陣列
- java 序列化與反序列化例項Java
- java多型-優化上個例項Java多型優化
- Java的類的例項化順序Java
- Java中內部類的例項化Java
- Java列舉:為什麼它是單例模式的最佳選擇?Java單例模式
- 為什麼java中用列舉實現單例模式會更好Java單例模式
- 為什麼不能和程式媛談戀愛?
- C#中為什麼不能繼承List?C#繼承
- google為什麼就不能退出中國Go
- 為什麼要做介面測試?怎麼做?