import java.util.*;public class FindDups
{
public static void main(String[] args)
{
Set s = new HashSet(); for (int i = 0; i < args.length; i++)
{
if (!s.add(args[i]))
{
System.out.println("Duplicate detected:" + args[i]);
}
}
System.out.println(s.size() + " distinct words detected:" + s);
}
}
其中有一句Set s = new HashSet();
对此我有一个疑问,s到底是什么,是一个HashSet类的对象吗,貌似Set是一个接口吧,无法产生实例的
如果是HashSet类的实例,为什么不写成HashSet s = new HashSet();呢?
另外还有一个问题,为什么这么写居然会是合法的呢?编译器是如何处理这句话的?

解决方案 »

  1.   

    Set s  = new HashSet();用HashSet实例化一个Set
      

  2.   

    多看看java基础。。面向接口的编程。。对以后软件的可扩展和灵活性有好处。。
      

  3.   

    接口类型的变量指向实现类的对象,这就是多态,or 面向接口编程or动态绑定。
      

  4.   

    恩,是多态,开始学的时候我也不理解,用的多了就知道了
    Set s = new HashSet();
    s虽然是声明为Set类型,但实际上是指向了HashSet()对象
      

  5.   

    HashSet是继承Set的,当然可以new出HashSet实例了。
      

  6.   

    Set s = new HashSet();
    这种实例化方法是java多态的一种表现!面向对象编程为了增加灵活性所以提出了面向接口或面向抽象编程!
    上面得灵活性表现为,只要实现了接口Set的对象都可以赋值给s!
      

  7.   

    举个例子你就知道这样写的好处了interface Parent(){
       public show(){...}
    }
    class ChildA() implements Parent{
       public show(){...}
    }
    class ChildB() implements Parent{
       public show(){...}
    }class Test(){
       public print(Parent p){
          //关键是这个方法,传入了一个Parent类型的对象
          p.show();
       }   public static void main(String[] args){
          Test t = new Test();
          Parent a = new ChildA();
          Parent b = new ChildB();
          t.print(a);  //这个时候a和b虽然是两个不同类ChildA和ChildB的对象,但是可以同时传入print中
          t.print(b);
       }
    }
    这个实子可能不是太好,不过也体现出了多态的一种用法
      

  8.   

        父类的引用指向子类的实例,是java的多态。举一个小例子你就明白了:假如牛是一个父类,其子类有奶牛、黄牛、黑牛、白牛等等,那么你可以说一只牛(父类的引用)是黑牛(子类的实例),之所以不用父类的实例,主要原因是此时的父类是一个接口,不能实例化(实际上实例化了也没有用,因为接口只定义了方法和属性,但是没有方法的实现,我们调用如何类都是为了调用它的方法,当然有些常量类也是为了调用其定义的属性)。所以这里要用父类的引用指向子类的实例,只有子类才实现了接口的方法,调用子类的方法才是有效的。
      

  9.   

    这就是父类引用指向子类对象,其中Set是父类,HashSet是子类,这一点你看看继承就应该懂了
      

  10.   

    首先HashSet是实现了Set接口 
    所以说Set是HashSet的父类
    java的多态性就有这么一点 父类的引用可指向子类对象
    即 Set s = new HashSet();
    比如说有个Person类 他有两个子类 分别是Man和Women类 
    你可以说Man是person 也可以说Women是Person 
    所以用子类来实例化父类 就是将子类的对象赋值给父类的应用
    这样做的好处是 你只要声明一个Person类的引用 就可以用来接收Women和Person类的对象 否则你要分别声明Women和Person的引用 在分别实例化
      

  11.   

    Set s = new HashSet();
    s虽然是声明为Set类型,但实际上是指向了HashSet()对象
    也就是hashset是实现了set接口。
      

  12.   

    典型的父类引用指向子类对象,这是多态,虽说Set是个借口,但是HashSet实现了这个借口,就可以这么写的
      

  13.   

    接口是可以被一个实现了接口的类实例化的。Set s = new HashSet();
    HashSet()返回一个实例化的Set接口对象。面向对象的多态性啊。楼主还是多看看书吧 
      

  14.   

    HashSet 实现了Set接口,这样写就代表多态咯!
      

  15.   

    这样去理解会十分简单··
    我需要一只动物··首先需要的是一条狗··但是或许一下我就需要一只猫··所以我创建一个动物的对象··这个动物对象指向一条狗···也就是:Animal a=new Dog()..