日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

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

展開全部

大家都知道Vector以及其他的容器可以不加任何修飾地e68a8462616964757a686964616f31333236373765存儲(chǔ)任何類型的對(duì)象,這給我們帶來了極大的方便,也使得容器很容易被復(fù)用,但是大多數(shù)時(shí)候我們可能需要只能存儲(chǔ)某一類型對(duì)象的Vector,這是因?yàn)槲覀儾幌M捎谧约菏д`或其他原因在Vector中添加(add())了不同類型的對(duì)象而導(dǎo)致在程序中其它地方的get()發(fā)生運(yùn)行時(shí)異常(這是由于不正確的類型轉(zhuǎn)化引發(fā)的),請(qǐng)看下面的例子:

//: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è)由于我的疏忽,錯(cuò)誤地將Integer類型的對(duì)象添加進(jìn)了v中 for(int j = 0; j < v.size(); j++){ dog = (Dog)v.get(j); //想一想,當(dāng)取到類型為Integer的對(duì)象時(shí)將引起ClassCastException System.out.println(dog); } }}

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

//: 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對(duì)象的DogVector dv.add(new Dog(1)); dv.add(new Dog(2)); dv.add(new Dog(3)); // dv.add(new Integer(4)); //此時(shí)如果再發(fā)生這種疏忽的話,編譯將不能通過 for(int i = 0; i < dv.size(); i++){ dog = dv.get(i); //此處也不需要向下轉(zhuǎn)型為Dog System.out.println(dog); } }}

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

Vector v = new Vector(); E在此處代表我們指定v中只能存放E這種類型的對(duì)象,這樣將確保我們不會(huì)錯(cuò)誤地將別的類型的對(duì)象添加進(jìn)去,如果你非要那樣做錯(cuò),編譯器也不會(huì)允許,并且我們?cè)谑褂胓et()方法的時(shí)候也不需要向下轉(zhuǎn)型為對(duì)象本身的類型E,因?yàn)榫幾g器已經(jīng)為我們完成了,它很清楚地知道v中存儲(chǔ)的對(duì)象類型就是E,而且get()返回的對(duì)象類型就是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)); //此時(shí)如果再發(fā)生這種疏忽的話,編譯將不能通過 for (int j = 0; j < v.size(); j++) { dog = v.get(j); //此處也不需要向下轉(zhuǎn)型為Dog,方法返回類型就是Dog System.out.println(dog); } }}

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

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

本回答由提問者推薦

已贊過

已踩過<

你對(duì)這個(gè)回答的評(píng)價(jià)是?

評(píng)論

收起

總結(jié)

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

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