Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 定义子类构造函数_Java_Subclass - Fatal编程技术网

Java 定义子类构造函数

Java 定义子类构造函数,java,subclass,Java,Subclass,我已经开始回到java,我有一个关于为对象定义构造函数的一般性问题: 我正在学习一个教程,其中他通过以下语句定义HashSet对象: Set<String> set = new HashSet<String>(list); HashSet<String> set = new HashSet<String>(list); 列表是一个列表对象 我想知道如果我用这种说法有什么区别: Set<String> set = new HashSe

我已经开始回到java,我有一个关于为对象定义构造函数的一般性问题: 我正在学习一个教程,其中他通过以下语句定义HashSet对象:

Set<String> set = new HashSet<String>(list);
HashSet<String> set = new HashSet<String>(list);
列表是一个列表对象

我想知道如果我用这种说法有什么区别:

Set<String> set = new HashSet<String>(list);
HashSet<String> set = new HashSet<String>(list);

谢谢

这与oops最重要的概念之一有关,即多态性。如果您使用HashSet代替set,那么您将无法构建灵活的代码。比如说,如果您想将对象作为参数传递给一个方法,那么如果有一天使用Set接口,您可以传递另一个实现,比如TreeSet,该方法将正常工作。这使得代码松散耦合。

Java集合框架的定义特征之一是它是一个基于接口的类型系统。API主要是通过可能扩展其他接口的接口定义的。基本接口是集合

通过这种方式,大多数集合实现(如ArrayList、HashSet等)也可以分配给collection类型的变量或参数。这为框架提供了大量的表达能力

大多数Java集合框架实现都有一个接受Collection类型参数的构造函数。这被称为转换构造函数,因为它允许您传入框架中的任何集合,其类型扩展了集合接口,并且大多数都这样做,并将该集合表示为新构造类型的集合

换言之:

List<String> list1 = Arrays.asList(new String[] { "one", "two", "three" });
HashSet<String> set1 = new HashSet<>(list1);
变量set1最终将包含对HashSet实例的引用,该实例包含列表实例list1中的所有对象。实际上,转换构造函数将数据的表示形式从列表转换为哈希集


只要可能,使用对象的接口作为其类型而不是实现类型通常是最佳实践。这给了您更大的灵活性。因此,列出myList=。。。优于ArrayList myList=..

这不是子类,这是接口实现。