日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java 中符号_谁能告诉我java中符号的用法,见代码

發(fā)布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 中符号_谁能告诉我java中符号的用法,见代码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

展開全部

大家都知道Vector以及其他的容器可以不加任何修飾地e68a8462616964757a686964616f31333236373765存儲任何類型的對象,這給我們帶來了極大的方便,也使得容器很容易被復(fù)用,但是大多數(shù)時候我們可能需要只能存儲某一類型對象的Vector,這是因為我們不希望由于自己失誤或其他原因在Vector中添加(add())了不同類型的對象而導(dǎo)致在程序中其它地方的get()發(fā)生運(yùn)行時異常(這是由于不正確的類型轉(zhuǎn)化引發(fā)的),請看下面的例子:

//:TestVector.javaimport java.util.Vector;class Dog{ private int number; public Dog(int number){ this.number = number; } public String toString(){ return "This is number #: " + number; }}public class TestVector { public static void main(String[] args) { Vector v = new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); v.add(new Integer(4)); //假設(shè)由于我的疏忽,錯誤地將Integer類型的對象添加進(jìn)了v中 for(int j = 0; j < v.size(); j++){ dog = (Dog)v.get(j); //想一想,當(dāng)取到類型為Integer的對象時將引起ClassCastException System.out.println(dog); } }}

注意帶有注釋的那兩行,這種錯誤在編譯時并不會提醒我們,只能在運(yùn)行時發(fā)生ClassCastException,這是(Dog)v.get(j)引起的,更糟糕的是當(dāng)發(fā)生這種錯誤之后我們很難找到錯誤的根源在哪里,換句話說就是我們到底在哪里錯誤地添加了那個非Dog類型的Integer對象,大家運(yùn)行程序就會明白。尤其是當(dāng)我們在離那個錯誤的v.add(new Integer(4))很遠(yuǎn)的地方(可能是很多層)調(diào)用(Dog)v.get(i)時更是如此。此時大家可能會想,如果限制v僅能添加Dog類型的對象,問題不就解決了嗎?這的確是個辦法,解決如下:

//: DogVector.javaimport java.util.Vector;public class DogVector { private Vector v = new Vector(); public void add(Dog dog){ v.add(dog); } public Dog get(int index){ return (Dog)v.get(index); } public int size(){ return v.size(); }}//:TestDogVector.javapublic class TestDogVector { public static void main(String[] args) { Dog dog; DogVector dv = new DogVector(); //明確地創(chuàng)建了只能存放Dog對象的DogVector dv.add(new Dog(1)); dv.add(new Dog(2)); dv.add(new Dog(3)); // dv.add(new Integer(4)); //此時如果再發(fā)生這種疏忽的話,編譯將不能通過 for(int i = 0; i < dv.size(); i++){ dog = dv.get(i); //此處也不需要向下轉(zhuǎn)型為Dog System.out.println(dog); } }}

問題得到了解決,但此時大家可能郁悶了,我們在這種情況下是不是要寫很多這樣乏味的代碼?每一類需要存儲的對象都得寫一個特定的集合類嗎?確實在JDK1.5以前這的確是個問題,好在JDK1.5版本中sun引進(jìn)了泛型--java參數(shù)化類型,到此,想必大家已經(jīng)意識到參數(shù)類型化所要解決的問題之一,就像下面這樣:

Vector v = new Vector(); E在此處代表我們指定v中只能存放E這種類型的對象,這樣將確保我們不會錯誤地將別的類型的對象添加進(jìn)去,如果你非要那樣做錯,編譯器也不會允許,并且我們在使用get()方法的時候也不需要向下轉(zhuǎn)型為對象本身的類型E,因為編譯器已經(jīng)為我們完成了,它很清楚地知道v中存儲的對象類型就是E,而且get()返回的對象類型就是E而不光是Object。試試下面的例子:

//: TestVector2.javaimport java.util.Vector;public class TestVector2 { public static void main(String[] args) { Vector v = new Vector(); Dog dog; v.add(new Dog(1)); v.add(new Dog(2)); v.add(new Dog(3)); //v.add(new Integer(4)); //此時如果再發(fā)生這種疏忽的話,編譯將不能通過 for (int j = 0; j < v.size(); j++) { dog = v.get(j); //此處也不需要向下轉(zhuǎn)型為Dog,方法返回類型就是Dog System.out.println(dog); } }}

通過使用參數(shù)類型化,還會發(fā)生更多的微妙的變化,這里的v.get(j)返回為Dog型只是其中一例,在上例中v的其他一些方法的參數(shù)或返回值也將發(fā)生變化,有些接收Object參數(shù)的方法此時只能接受Dog或其派生類對象,如v.Set(int Index, Dog element),注意如果使用Dog及其派生以外的Object類型的對象做參數(shù)時將發(fā)生編譯期錯誤,這也正是我們在這種情況下想要的效果,是不是很爽呢?

好了,羅嗦了這么多,其目的就是想讓大家從問題的根源來理解概念,如果大家還想對其深入的話,可以找一些專門的資料來看看,想必學(xué)過C++的朋友應(yīng)該對此很容易理解,因為java的參數(shù)化類型正是借鑒了C++中模板的概念。(如果你發(fā)現(xiàn)此貼中有不準(zhǔn)確的地方,望及時指正,以免誤人!謝謝!)

本回答由提問者推薦

已贊過

已踩過<

你對這個回答的評價是?

評論

收起

總結(jié)

以上是生活随笔為你收集整理的java 中符号_谁能告诉我java中符号的用法,见代码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。