㈠ java 類型轉換的原理是什麼
java中的數據類型分為兩種:基本類型、引用類型。基本數據類型沒有什麼好說的byte char short int long float double boolean,這些類型除了boolean之外,其他的與C語言中的類型沒有太大的區別。因為這篇文章的論題是類型轉換,所以在此不討論boolean值的用法。下面要說的是引用類型。引用在有的書里也叫做句柄,它很類似C/C++中的指針,但要注意引用和指針並不是同一個概念。指針是一個存放地址的變數,他使C/C++程序員能夠靈活地訪問內存,但這也給程序的安全性帶來了很大的隱患,由於程序員可以對指針隨意的運算操作,所以一不留神就會破壞其他的存儲單位,導致程序中出現意想不到的結果。引用繼承了指針節省內存的優點,又限制了對地址的操作,所以他是安全的。引用類型包括所有類生成的實例和數組(不管是對象數組還是基本類型數組都實現Cloneable介面,所以他也是一個對象實例),所有引用類型都繼承自Object這個類。要說明一點的是java中的所有變數都是一個引用,不管是引用類型還是基本類型。現在要正式討論類型的轉換了。用過C/C++的人對基本類型的轉換都會很清楚,基本類型轉換分為類型提升和強制轉換。
例如:
int a=100;
long
b=a+100; //這個地方就用到了類型提升,a+100從int提升到了long
a=(int)b;//這個地方用到了強制轉換
強制類型轉換在某種情況下會丟失精度,如:
byte b;
int a=200;
b=(byte)a;//雖然這里用到了強制轉換,但因為byte的范圍是-127到127
//所以強制轉換後寬度會被截短
在java中除了這些轉換之外基本數據類型還可以被隱式的轉換成String,例如:
System.out.print("轉換"+100);//如果在數據前面有字元串用+連接
//就會隱式的轉換成String
引用類型的轉換實現起來要比C++簡單的多,如果一個對象與另一個對象沒有任何的繼承關系,那麼他們就不能進行類型轉換。如果要把一個派生類對象賦值給基類對象這個稱為上溯造型。如果要把基類對象賦值給派生類對象就需要強制類型轉換,這稱為下溯造型,下溯造型有一些危險,要安全的進行下溯造型有一個前題,基類對象必須是從派生類對象中上溯過來的。
例如:
class Base{}
class Child extends Base{
public static void main(String[] args){
Base base=new Child();//上溯造型
Child child=(Child)base;//下溯造型
Child child1=(Child)new
Base();//拋出ClassCastException異常
}
}
最後,談一談String與引用類型的轉換。前面已經說過,所有的對象都是從Object繼承過來的,Object中有一個toString方法。這個方法是所有的對象都可以轉換成String,如果想把自定義的類轉換成String,最安全的做法是重寫toString方法。和基本類型一樣如果對象前有String對象用+連接,對象就會隱式轉換成String,這種情況實際上是隱式調用了toString方法。
㈡ java運行原理
一個類的載入運行舉個例子:1.User u = new User();(存放在內存的堆區)
創建了一個User類實例,也就是說在聲明該類的時候才會去載入這個類,實際上是通過這個類的CLASS實例實例化的。方法如下:
User u=(User)Class.forName("User").newInstance();
2.u.setName("admin"); u.setPwd("159");(存放在內存的棧區)
調用該類的方法,為該類的變數賦值,Java虛擬機內部調用是這樣的,通過方法區找到該方法,所以那些類型、方法、變數、常量什麼的都放在這個方法區中
3.String name = u.getName(); String pwd = u.getPwd();
與第二步類似,不同的是將取得的值分別賦給了變數name和pwd。關鍵是這個值保存在哪裡?和實例對象一樣,存放在堆區。這個時候應該可以看出CLASS實例的作用了,它就是起個中間作用,將程序中的調用反應到堆區上數據的變化。
我也有點模糊 個人觀點不喜勿噴 有錯請指出
至於相關電子書這個我覺得可以去看看官方的文檔比較好 在加上自己的理解、操作
㈢ java中read()方法的原理是什麼
read方法是讀取位元組流。
可以通過BufferedReader 流的形式進行流緩存,之後通過read方法獲取到緩存的內容。
BufferedReader bre = null;
try {
String file = "D:/test/test.txt";
bre = new BufferedReader(new FileReader(file));//此時獲取到的bre就是整個文件的緩存流
while ((str = bre.read())!= -1) // 判斷是否為最後一個位元組,是的話結束循環
{
System.out.println(str);//輸出讀到的內容
};
流用完之後必須close掉,如上面的就應該是:bre.close(),否則bre流會一直存在,直到程序運行結束。
備註:位元組流讀取過程中很容易出現亂碼,建議可以用readLine方式進行每行的讀取。
㈣ 你知道java的運行原理是什麼嗎
Java這一語言的執行過程也遵循這樣的過程:源代碼--->機器碼。 但是,從源代碼到機器碼之間,究竟經過什麼樣的過程,則是Java獨一無二的了。寬泛地講,Java源代碼(.java)經過java編譯器(javac.exe)編譯之後,並沒有直接轉化為機器碼,而是轉化成一種中間格式,成為位元組碼(.class),位元組碼再經過java虛擬機轉化成特定CPU架構的機器碼。也正是因為這一中間物,java才有所謂的跨平台。在windows平台上編譯好的位元組碼,到linux平台後,經過為linux而設計的Java虛擬機解釋後即可執行。跨平台這一特徵,是通過位元組碼和JVM來實現的。
因此,想搞清楚java程序到底是如何運行的,重點在於弄明白位元組碼是如何被轉化成跟CPU架構相關的機器碼然後被執行的。也就是要理解JVM到底是如何工作的。在了解JVM之前,我們再跳出來一下,先看看什麼是虛擬機。所謂虛擬機,我是這么理解的:用軟體的方式模擬出跟硬體類似的環境,比如說寄存器、存儲器等等。當然,所有最終的工作還是由原來的CPU來完成。比如說VirtualBox這個虛擬機產品,它其實就是一個應用程序,用某種編程語言編寫的應用程序。當運行這個應用程序時,它會要求操作系統給它獨立施展手腳的空間:給我一些內存,給我一定的CPU時間片,然後不用管我了。你可能會問,寄存器是硬體啊,它怎麼能劃分啊,難道是時間劃分?不是的,像內存這樣的硬體,可以給虛擬機一塊獨立的內存塊,但是寄存器之後的,則需要用「模擬模擬」的方式來模擬。OK,回到Java虛擬機。到底什麼是Java虛擬機,很難有一個十分明確的定義,狹窄一點說,它就是一個應用程序,大部分用C++編寫的。寬泛地說,它就是執行位元組碼的一整個環境。
㈤ java線程原理
首先你這兩個線程都是永不停止的
在電腦操作系統內部,有個東西叫readyList。當t2.start(); t3.start(); 執行後,這兩個線程以及main線程(3個線程)都被放入了readyList。
之後你可以這么理解,假設這三個線程的priority(優先順序別)是一樣的,每個線程只准執行萬分之一秒,然後readyList的scheler就來管了:線程1,你的時間到了,給我滾回readyList里去。下個線程准備
有關java更多線程,可以在oracle網站上找哦,我在這里學到了很多東西。
參考資料:http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html
㈥ Java語言中,數組的實現原理是什麼
java不支持指針,也不支持在類外定義函數,所以如果你在java里這么做是沒有意義的,這不符合java的思想。如果你非要把重點放在函數上,你可以在類里定義函數,然後從類間接調用函數。
㈦ java 運行原理是什麼
java有一個垃圾回收機制,總是在內存剩餘大概5%才啟動,因為它中斷許可權最高,它運行,其他全部停止,因此,我們不希望垃圾回收機制頻繁啟動,那麼就要控制內存不要觸碰剩餘5%底線。
而在普通JavaBeans系統中,每一次客戶端請求訪問時,系統總是new一個javabeans或Java Class,如果並發訪問量很大,比如並發10人或100人,再加上你的系統復雜,有很多JavaBeans,假設有30個,那麼這下子100個並發請求來,就有3000個Java對象創建,然後下一批有來一次100個請求,這象潮水一樣。
每次請求產生的3000個對象會繼續佔用內存,不會被垃圾回收機制回收,因為垃圾回收機制只有等到內存剩餘5%才啟動,這樣,你的內存無論多大,取決於訪問量,總會被耗光,最後垃圾回收出來收拾殘局,你的業務系統被暫停甚至緩慢。
所以,這里需要有資源控制,將內存能夠控制住,不要被無限消耗,最後導致垃圾回收啟動,造成系統好像死機。
控制資源就是使用Pool或Cache來控制,Spring/JdonFramework下可自行加入; EJB已經默認加入了。
這也是我一直反對使用Jsp+JavaBeans來寫復雜或大訪問量的系統,至於如何控制伺服器資源,只有資料庫連接池是不夠的,因為Bean才是真正的資源消耗重點。
如果你理論上屬於無知,又狂熱追求Spring這些新玩藝(當初),那麼,即使你使用Spring,性能還是和Jsp+JavaBeans一樣,在大訪問量情況下經常死機,因為Spring裡面需要手工配置Pool或Cache這些資源控制機制。
如果說Java比C方便,因為對象使用之後不需要清理,那麼有了Ioc/DI依賴注射以後,Java中對象使用之前也不需要創建了。
spring 的好處,不用創建javabean對象了。
㈧ java編程原理(簡單的說一下)
java語言編寫的源程序在計算機上需要經過編譯和解釋執行兩個嚴格區分的階段。java的編譯源程序先將java源程序翻譯成與機器無關的節碼(bytecode),不是通常的編譯程序將源程序翻譯成特定計算機的機器代碼。運行時系統裝載和鏈接需要執行的類,並做必須的優化後,解釋執行位元組碼程序。
㈨ JAVA介面的原理
介面的實現原理 應該說介面實現是沒有什麼原理的
你定義了一個介面 不去用他也是可以的 沒有問題的
介面可以說是一個工具 或者說是一個規范
在寫作文的時候 老師規定要列提綱 但是實際上作文是可以脫離
提綱而獨立存在 但是有了提綱我們就能很快了解到作為的內容
介面一樣的 一開始我們編程 可能都用不到介面 所以一直在迷惑
這介面到底有什麼作用。
介面當然很有用
等到你做一個大的項目的時候 你就會發現 有一些實體 服務 他們都是差不多的
那就有必要事先把這些服務抽象出介面來
然後我們的編碼就按照介面的規范來實現具體的功能。
以後要是資料庫表結構發生了大變化 重構代碼難度很大 需要這部分功能重新開放 那麼這個介面 就可以復用 對這個介面 進行實現就可以了。
總結出來:介面是服務於我們的代碼 讓我們的代碼更好理解 更有層次感
具體的系統功能 還是在我們的實現類底下的 service最終還是調用我們實現類的
以上原創 手打 沒有用標點的習慣
㈩ java中反射原理,和應用
此問題就是給你寫一篇10000字的作文都不一定能將的清楚,我大致上說一下,反射的原理:一類事物在一起統稱一個類class,所有的class在一起統稱類Class,注意大小寫;用類CLass去調用我們的一個類class用的就是反射,在SSH裡面經常有配置文件裡面需要寫一個類的全名,然後框架就會去調用這個類,你想過為什麼嗎?他系統有不可能直接NEW一個你這個類的對象,他是如何調用類裡面的方法?這個就是反射的強大之處了,不用new的,只要一個類的全名就能執行裡面的方法