先前也问过一个差不多的帖子,但是回贴都是反复强调多态啊什么的 都没真正解我的惑,Set <Integer> intset = new HashSet <Integer>() Set是个接口,为什么对接口建立对象引用而“映射”的却是对类HashSet的构造?
 
  书中说是为了安全,确实,intset无法访问HashSet中Set没有的方法,但是这样有用吗?有没有访问是程序员的事情啊!!! 
  书中大部分都是这样的构造,不知道这样有什么好处啊?我看向上转型中没这个例子啊? 悟性不行罗... 
  我猜想的话:是不是intset还可以访问除HashSet外的别的类的方法才这样的还是???
  各位前辈指点下新手小弟,现在这个问题已经让我没法继续在书中前行了....

解决方案 »

  1.   

    接口是不能实例化的,可以把使用接口的类创建的对象的引用赋给该接口声明的接口变量中,者可以实现接口的回调技术,这样写程序也不容易出错,insert不能访问Hashset外别的类的方法,当然Object除外
      

  2.   

    多态的应用可以实现代码的可扩展,我觉得这也许是多态主要目的。就拿Set <Integer> intset来说,如果你在一个类里面用了intest,下次你想把HashSet或者TreeSet都可以用同一个insert,可以扩展更多其他实现了Set接口的类,如果你不这样的话,你想用HashSet和TreeSet,就得在类里面写两个成员类变量,再加类又要去修改源代码,是不是很麻烦啊。
    反正建议能用多态的地方最好都向上转型
      

  3.   

    LZ的這個問題嚴重了。沒有理解到接口精髓。就你所的HashSet這個類中,做了什麼呢? 它 implement Set 實現了Set接口。 那麼接口有個規定:實現這個接口,就一定要實現這個接口中所定義的方法。 你想想,假如我自己寫個類叫 myclass implement Set 這樣的話,我的myclass類是不是也要強行實現Set的方法。那麼調就可以這麼講,只要實現Set接口的類就一定有Set類中所定義的方法的實現,所以,以Set作為類樣式,來呼叫其中定議的方法,那麼這個方法就一定被實現了的,所以這叫做 類型安全。相反,我們把具有Set類樣式的子類,強制轉換成,Set的子類(無論這個類是不是原來轉成(Set)的同一對象),都是不安全的,因為,Set類的子類類型有很多,不能確定你所強制轉換的類型是對的。// 假如HashSet and myclass 類都 實現了Set接口HashSet hs = new HashSet(); // hs is HashSet type.
    myclass mc = new myclass();  // mc is myclass type.Set myset = (Set)hs;         // 這是安全的
    Set myset2 = (Set)mc;        // 這是安全的HashSet hs3 = (HashSet) myset; // 這是不安全的
    myclass hs4 = (myclass ) myset; // 這是不安全的。
    關於為什麼要這麼用,太多了,一時半會兒講不清楚,自己慢慢看吧。
      

  4.   

    A a = new B();
    a可以强制向下转换成B
    面向接口编程!
      

  5.   

    楼主有点理解偏差。
    Set <Integer> intset = new HashSet <Integer>();
    这个代码有两个亮点。
    1.安全性,这个体现在<Integer>,这个set实例化后只能add Integer类型的对象,不会add诸如string之类的对象,所以在取的时候不用担心取出来别的类型数据而抛出异常。
    2.面向接口编程。intset是Set,具体来说是一个HashSet,如果说我要查询速度,我可以new HashSet(),如果要枚举的时候有序则可以new TreeSet(),而下面的所有代码都不会因为intset类型改变而重写代码。