Java中的動(dòng)態(tài)和靜態(tài)編譯實(shí)例詳解
Java中的動(dòng)態(tài)和靜態(tài)編譯實(shí)例詳解
首先,我們來(lái)說(shuō)說(shuō)動(dòng)態(tài)和靜態(tài)編譯的問(wèn)題。
Q: java和javascript有什么區(qū)別?
總結(jié)了一下:有以下幾點(diǎn)吧:
1.首先從運(yùn)行環(huán)境來(lái)說(shuō)java代碼是在JVM上編譯成class文件,而javascript則直接在瀏覽器上加載運(yùn)行。
2.由第一點(diǎn)可看出,java代碼需要編譯,而javascript不需要編譯。
3.從語(yǔ)言性質(zhì)來(lái)說(shuō),java是一種高級(jí)編程語(yǔ)言,對(duì)變量檢查要求嚴(yán)格,javascript只是一個(gè)簡(jiǎn)單的解釋性的腳本語(yǔ)言,對(duì)變量檢查及要求很弱。
4.javascript是一種動(dòng)態(tài)的語(yǔ)言,java則是"半動(dòng)態(tài)"的。
javascript是動(dòng)態(tài)的,這無(wú)須質(zhì)疑。為什么java是半動(dòng)態(tài)的?請(qǐng)看下列代碼:
public class Color{ public void changeColor(){ System.out.println("要改變的顏色是紅色"); } }
public class Frame{ public static void main(String args[]){ Color c=new Color(); c.changeColor(); } }
Frame類中通過(guò)直接new一個(gè)Color對(duì)象從而調(diào)用其方法,這是在編譯時(shí)確定對(duì)象,從而確定關(guān)系。我認(rèn)為這是java語(yǔ)言靜態(tài)性的一個(gè)體現(xiàn)。而且如果編譯后的Color.class文件丟失,會(huì)報(bào)一個(gè)錯(cuò)誤。
java.lang.NoClassDefFoundError........
如果通過(guò)以下代碼,我們則可以發(fā)現(xiàn)java的動(dòng)態(tài)性:
public interface Color{ public void changeColor(); }
public class ColorImp implements Color{ public void changeColor(){ System.out.println("顏色改變?yōu)榧t色"); } }
public class Frame{ public static void main(String args[])throws Exception{ System.out.println("請(qǐng)輸入您要輸入的類的名字"); //輸入一個(gè)類的名字 java.util.Scanner sc=new java.util.Scanner(System.in); String s=sc.next(); //加載這個(gè)類 Class c=Class.forName(s); //獲得這個(gè)類的實(shí)例化對(duì)象 Object obj=c.newInstance(); //強(qiáng)制轉(zhuǎn)型 Color color=(Color)obj; color.changeColor(); } }
注意Frame類,當(dāng)我們編譯它的時(shí)候,只會(huì)出現(xiàn)兩個(gè)class文件--Frame.class和Color.class,然后我們運(yùn)行這個(gè)程序,由于沒(méi)有編譯ColorImp,會(huì)拋出一個(gè)異常-- java.lang.ClassNotFoundException。
于是,我們打開(kāi)另一個(gè)cmd進(jìn)程,單獨(dú)編譯ColorImp類,再在上一個(gè)cmd對(duì)話框中輸入ColorImp,則程序會(huì)正常運(yùn)行。
這樣我們可以在不停止程序運(yùn)行的情況下,動(dòng)態(tài)地加載一個(gè)類。我認(rèn)為這體現(xiàn)出了Java的動(dòng)態(tài)性。通過(guò)上面的例子,我認(rèn)為java語(yǔ)言是一種“半動(dòng)態(tài)”語(yǔ)言。
我們可以看出,上述例子使用了Color接口類。這里不得不提我對(duì)接口的一點(diǎn)小小感觸。
在使用數(shù)據(jù)庫(kù)的時(shí)候,Java語(yǔ)言只是定義了一個(gè)數(shù)據(jù)庫(kù)接口,然后不同的數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)這個(gè)借口。這些包括了(以mysql數(shù)據(jù)庫(kù)為例)
加載數(shù)據(jù)庫(kù)驅(qū)動(dòng):
Class.forName("com.mysql.jdbc.Driver");
建立與數(shù)據(jù)庫(kù)的鏈接:
java.sql.Connection conn = java.sql.DriverManager.getConnection( url, user, password);
取得編譯對(duì)象和結(jié)果集對(duì)象等,這些都只是定義了接口,具體的實(shí)現(xiàn)則交給了數(shù)據(jù)庫(kù)開(kāi)發(fā)商,只要實(shí)現(xiàn)了這個(gè)接口就行。這就體現(xiàn)了接口的擴(kuò)展性和規(guī)范性。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
JDK、J2EE、J2SE、J2ME四個(gè)易混淆概念區(qū)分
這篇文章將向你詳細(xì)介紹JDK、J2EE、J2SE、J2ME的概念以及他們的關(guān)系區(qū)別。2015-09-09Java HashSet集合存儲(chǔ)遍歷學(xué)生對(duì)象代碼實(shí)例
這篇文章主要介紹了Java HashSet集合存儲(chǔ)遍歷學(xué)生對(duì)象代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04java request.getParameter中文亂碼解決方法
今天跟大家分享幾個(gè)解決java Web開(kāi)發(fā)中,request.getParameter()獲取URL中文參數(shù)亂碼的解決辦法,需要的朋友可以參考下2020-02-02Java JDK動(dòng)態(tài)代理(AOP)的實(shí)現(xiàn)原理與使用詳析
所謂代理,就是一個(gè)人或者一個(gè)機(jī)構(gòu)代表另一個(gè)人或者另一個(gè)機(jī)構(gòu)采取行動(dòng)。下面這篇文章主要給大家介紹了關(guān)于Java JDK動(dòng)態(tài)代理(AOP)實(shí)現(xiàn)原理與使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的方法
這篇文章主要介紹了在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的教程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05新手入門學(xué)習(xí)Spring Freemarker教程解析
這篇文章主要介紹了新手入門學(xué)習(xí)Freemarker教程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10