Java中为什么会有这种写法

时间:2022-12-01 20:19:33

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();呢?
另外还有一个问题,为什么这么写居然会是合法的呢?编译器是如何处理这句话的?

33 个解决方案

#1


Set s  = new HashSet();

用HashSet实例化一个Set

#2


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

#3


接口编程

#4


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

#5


实例化HashSet的一个对象

#6


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

#7


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

#8


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

#9


楼主基础还薄弱了点,再去看看什么是封装、多态、继承吧。

#10


你多看看基础哦 ,这个叫 里氏替换原则

#11


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

#12


举个例子你就知道这样写的好处了

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);
   }
}


这个实子可能不是太好,不过也体现出了多态的一种用法

#13


父类的对象指向指向子类的实例

#14


引用 13 楼 sl346571110 的回复:
父类的对象指向指向子类的实例

+1

#15


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

#16


父类引用指向子类对象 很经典的面向对象特征

#17


多态!多态!

父类引用指向子类对象

#18


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

#19


引用 1 楼 hardycheng 的回复:
Set s  = new HashSet();

用HashSet实例化一个Set
正解

#20


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

#21


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

#22


引用 20 楼 bekeer 的回复:
首先HashSet是实现了Set接口 
所以说Set是HashSet的父类
java的多态性就有这么一点 父类的引用可指向子类对象
即 Set s = new HashSet();
比如说有个Person类 他有两个子类 分别是Man和Women类 
你可以说Man是person 也可以说Women是Person 
所以用子类来实例化父类 就是将子类的对象赋值给父类的应用
这样做的……


这个讲的比较详细

#23


接口正是这门语言的精髓所在,楼主应多研究。

#24


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

#25


父类对象 引用 子类对象
多态的一种表现.......

#26


这样写是科学的写法,便于以后扩展,接口类型的变量可以用实现该接口的类实例化!

#27


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

#28


面向接口编程 多台 动态绑定

飘过...

#29


是Java多态。。。

#30


多看看基础吧

#31


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

#32


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

#33


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

#1


Set s  = new HashSet();

用HashSet实例化一个Set

#2


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

#3


接口编程

#4


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

#5


实例化HashSet的一个对象

#6


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

#7


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

#8


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

#9


楼主基础还薄弱了点,再去看看什么是封装、多态、继承吧。

#10


你多看看基础哦 ,这个叫 里氏替换原则

#11


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

#12


举个例子你就知道这样写的好处了

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);
   }
}


这个实子可能不是太好,不过也体现出了多态的一种用法

#13


父类的对象指向指向子类的实例

#14


引用 13 楼 sl346571110 的回复:
父类的对象指向指向子类的实例

+1

#15


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

#16


父类引用指向子类对象 很经典的面向对象特征

#17


多态!多态!

父类引用指向子类对象

#18


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

#19


引用 1 楼 hardycheng 的回复:
Set s  = new HashSet();

用HashSet实例化一个Set
正解

#20


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

#21


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

#22


引用 20 楼 bekeer 的回复:
首先HashSet是实现了Set接口 
所以说Set是HashSet的父类
java的多态性就有这么一点 父类的引用可指向子类对象
即 Set s = new HashSet();
比如说有个Person类 他有两个子类 分别是Man和Women类 
你可以说Man是person 也可以说Women是Person 
所以用子类来实例化父类 就是将子类的对象赋值给父类的应用
这样做的……


这个讲的比较详细

#23


接口正是这门语言的精髓所在,楼主应多研究。

#24


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

#25


父类对象 引用 子类对象
多态的一种表现.......

#26


这样写是科学的写法,便于以后扩展,接口类型的变量可以用实现该接口的类实例化!

#27


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

#28


面向接口编程 多台 动态绑定

飘过...

#29


是Java多态。。。

#30


多看看基础吧

#31


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

#32


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

#33


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