A. java中,類的對象,對象的實例,對象的引用,三者如何進行區分,有何區別呢
沒有「對象的實例」這種叫法,正確的叫法是「類的實例」。
沒有學過java,給你說說我的理解吧!
在java和C++這類語言中,對象(對象和實例是同義詞)實際上就是內存中的存儲數據一塊固定存儲空間,並且對象還有一系列的操作這塊存儲空間的方法。
對象的引用相當於對象的名字,名字與對象本身的區別就好比你的名字和你本人的區別。java里使用對象只能通過引用的方式,基本數據類型的變數和CC++的變數規則一樣。
如:
UserTypeut=newUserType();//ut是引用,實際的對象在內存里。
ut=newUserType();/*現在ut是另一個對象的引用,先前的對象被垃圾回收了(因為先前的對象不能被再次使用了)。*/
UserTypeut2;//定義了一個引用ut2,他不引用任何對象,不能使用。。。。
ut2=newUserType();//然ut2成為一個對象的引用。
UserTypeut3=newUserType();
UserTypeut4=newUserType();
ut3=ut4;//現在ut3引用ut4的對象,這里不是賦值。。。
inta=5;
intb=4;
a=b;//這里是賦值。ab依然引用不同的對象
類型轉換就是把一種類型的對象當做另一種類型的對象來使用。一些類型轉換會自動發生,另一些需要強制類型轉換,強制一般都會出問題,自動的也需要注意。
以上純屬個人理解,樓主慎讀之。。。。
B. 在java中怎樣將object轉換int [編程]
class objectTOint{
public static void main(){
Object a = 4;
int b =1;
if( b > (Integer)a)
System.out.print("success.");
}
}
我比較懶,這種方法最簡單,反正你只要比較就可以了int是強類型,而Object是弱類型,既然不能從強類型轉成弱類型,那就轉成Integer也就是沖譽整型的強類型就好了。值得提的粗或是JDK 6完成了自動裝箱、解箱也岩判伍就是說,你要是用JDK 6就可以實現Object轉int了。
C. Java編譯時註解和運行時註解有什麼區別
重寫,重載,泛型,分別是在運行時還是編譯時執行的
1. 方法重載是在編譯時執行的,因為,在編譯的時候,如果調用了一個重載的方法,那麼編譯時必須確定他調用的方法是哪個。如:
當調用evaluate("hello")時候,我們在編譯時就可以確定他調用的method #1.
2.
方法的重寫是在運行時進行的。這個也常被稱為運行時多態的體現。編譯器是沒有辦法知道它調用的到底是那個方法,相反的,只有在jvm執行過程中,才知曉到底是父子類中的哪個方法被調用了當有如下一個介面的時候,我們是無法確定到底是調用父類還是子類的方法
3.
泛型(類型檢測),這個發生在編譯時。編譯器會在編譯時對泛型類型進行檢測,並吧他重寫成實際的對象類型(非泛型代碼),這樣就可以被JVM執行了。這個過程被稱為"類型擦除"。
類型擦除的關鍵在於從泛型類型中清除類型參數的相關信息,並且再必要的時候添加類型檢查和類型轉換的方法。
類型擦除可以簡單的理解為將泛型java代碼轉換為普通java代碼,只不過編譯器更直接點,將泛型java代碼直接轉換成普通java位元組碼。類型擦除的主要過程如下:
1). 將所有的泛型參數用其最左邊界(最頂級的父類型)類型替換。
2). 移除所有的類型參數。
在編譯後變成:
4. 註解。註解即有可能是運行時也有可能是編譯時。
如java中的@Override註解就是典型的編譯時註解,他會在編譯時會檢查一些簡單的如拼寫的錯誤(與父類方法不相同)等
同樣的@Test註解是junit框架的註解,他是一個運行時註解,他可以在運行時動態的配置相關信息如timeout等。
5. 異常。異常即有可能是運行時異常,也有可能是編譯時異常。
RuntimeException是一個用於指示編譯器不需要檢查的異常。RuntimeException
是在jvm運行過程中拋出異常的父類。對於運行時異常是不需要再方法中顯示的捕獲或者處理的。
已檢查的異常是被編譯器在編譯時候已經檢查過的異常,這些異常需要在try/catch塊中處理的異常。
6. AOP. Aspects能夠在編譯時,預編譯時以及運行時使用。
1).
編譯時:當你擁有源碼的時候,AOP編譯器(AspectJ編譯器)能夠編譯源碼並生成編織後的class。這些編織進入的額外功能是在編譯時放進去的。
2). 預編譯時:織入過程有時候也叫二進制織入,它是用來織入到哪些已經存在的class文件或者jar中的。
3). 運行時:當被織入的對象已經被載入如jvm中後,可以動態的織入到這些類中一些信息。
7. 繼承:繼承是編譯時執行的,它是靜態的。這個過程編譯後就已經確定
8. 代理(delegate):也稱動態代理,是在運行時執行。
D. java類型轉換錯誤
通常使用強制類型轉換將父類型轉換成子類型時,是不會有編譯錯誤的,只會有運行時拋出ClassCast的異常,如果編譯提示錯誤,那肯定是因為你轉換的時候類型就匹配,被轉換的對象和目標類型不是子父類/介面實現類的關系,自然編譯不通過
E. Java中對象類型轉換原則有哪些
Java數據類型的轉換原則
從低精度向高精度轉換
byte 、short、int、long、float、double、char
註:兩個char型運算時,自動轉換為int型;當char與別的類型運算時,也會先自動轉換為int型的,再做其它類型的自動轉換
基本類型向類類型轉換
正向轉換:通過類包裝器來new出一個新的類類型的變數
Integer a= new Integer(2);
反向轉換:通過類包裝器來轉換
int b=a.intValue();
類類型向字元串轉換
正向轉換:因為每個類都是object類的子類,而所有的object類都有一個toString()函數,所以通過toString()函數來轉換即可
反向轉換:通過類包裝器new出一個新的類類型的變數
eg1: int i=Integer.valueOf(「123」).intValue()
說明:上例是將一個字元串轉化成一個Integer對象,然後再調用這個對象的intValue()方法返回其對應的int數值。
eg2: float f=Float.valueOf(「123」).floatValue()
說明:上例是將一個字元串轉化成一個Float對象,然後再調用這個對象的floatValue()方法返回其對應的float數值。
eg3: boolean b=Boolean.valueOf(「123」).booleanValue()
說明:上例是將一個字元串轉化成一個Boolean對象,然後再調用這個對象的booleanValue()方法返回其對應的boolean數值。
eg4:double d=Double.valueOf(「123」).doubleValue()
說明:上例是將一個字元串轉化成一個Double對象,然後再調用這個對象的doubleValue()方法返回其對應的double數值。
eg5: long l=Long.valueOf(「123」).longValue()
說明:上例是將一個字元串轉化成一個Long對象,然後再調用這個對象的longValue()方法返回其對應的long數值。
eg6: char=Character.valueOf(「123」).charValue()
說明:上例是將一個字元串轉化成一個Character對象,然後再調用這個對象的charValue()方法返回其對應的char數值。
F. Java什麼情況下強轉型 編譯不報錯,運行會報錯
向下強制轉型——把一個父類(或祖先類)引用強制轉換成一個子類(或孫類)引用,是不會發生編譯錯誤的。
但如果這個父類(或祖先類)引用實際引用(指向)的對象,不是一個子類(或孫類)對象,運行時就會拋出異常。
舉例來說,如果鳥類和狗類都是動物類的子類。
如果有一個動物類的引用a引用了一個鳥類對象,則此時將a強制轉換成狗類引用,就不會報編譯錯誤,但運行時會拋出類型轉換異常。
因為a這個裝動物的籠子,實際上關的是一隻鳥,而需要的動物是一隻狗。