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
用HashSet实例化一个Set
#2
多看看java基础。。面向接口的编程。。对以后软件的可扩展和灵活性有好处。。
#3
接口编程
#4
接口类型的变量指向实现类的对象,这就是多态,or 面向接口编程or动态绑定。
#5
实例化HashSet的一个对象
#6
恩,是多态,开始学的时候我也不理解,用的多了就知道了
Set s = new HashSet();
s虽然是声明为Set类型,但实际上是指向了HashSet()对象
Set s = new HashSet();
s虽然是声明为Set类型,但实际上是指向了HashSet()对象
#7
HashSet是继承Set的,当然可以new出HashSet实例了。
#8
+1
#9
楼主基础还薄弱了点,再去看看什么是封装、多态、继承吧。
#10
你多看看基础哦 ,这个叫 里氏替换原则
#11
Set s = new HashSet();
这种实例化方法是java多态的一种表现!面向对象编程为了增加灵活性所以提出了面向接口或面向抽象编程!
上面得灵活性表现为,只要实现了接口Set的对象都可以赋值给s!
这种实例化方法是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
+1
#15
父类的引用指向子类的实例,是java的多态。举一个小例子你就明白了:假如牛是一个父类,其子类有奶牛、黄牛、黑牛、白牛等等,那么你可以说一只牛(父类的引用)是黑牛(子类的实例),之所以不用父类的实例,主要原因是此时的父类是一个接口,不能实例化(实际上实例化了也没有用,因为接口只定义了方法和属性,但是没有方法的实现,我们调用如何类都是为了调用它的方法,当然有些常量类也是为了调用其定义的属性)。所以这里要用父类的引用指向子类的实例,只有子类才实现了接口的方法,调用子类的方法才是有效的。
#16
父类引用指向子类对象 很经典的面向对象特征
#17
多态!多态!
父类引用指向子类对象
父类引用指向子类对象
#18
这就是父类引用指向子类对象,其中Set是父类,HashSet是子类,这一点你看看继承就应该懂了
#19
正解
#20
首先HashSet是实现了Set接口
所以说Set是HashSet的父类
java的多态性就有这么一点 父类的引用可指向子类对象
即 Set s = new HashSet();
比如说有个Person类 他有两个子类 分别是Man和Women类
你可以说Man是person 也可以说Women是Person
所以用子类来实例化父类 就是将子类的对象赋值给父类的应用
这样做的好处是 你只要声明一个Person类的引用 就可以用来接收Women和Person类的对象 否则你要分别声明Women和Person的引用 在分别实例化
所以说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接口。
s虽然是声明为Set类型,但实际上是指向了HashSet()对象
也就是hashset是实现了set接口。
#22
这个讲的比较详细
#23
接口正是这门语言的精髓所在,楼主应多研究。
#24
典型的父类引用指向子类对象,这是多态,虽说Set是个借口,但是HashSet实现了这个借口,就可以这么写的。。。。。。
#25
父类对象 引用 子类对象
多态的一种表现.......
多态的一种表现.......
#26
这样写是科学的写法,便于以后扩展,接口类型的变量可以用实现该接口的类实例化!
#27
接口是可以被一个实现了接口的类实例化的。Set s = new HashSet();
HashSet()返回一个实例化的Set接口对象。面向对象的多态性啊。楼主还是多看看书吧
HashSet()返回一个实例化的Set接口对象。面向对象的多态性啊。楼主还是多看看书吧
#28
面向接口编程 多台 动态绑定
飘过...
飘过...
#29
是Java多态。。。
#30
多看看基础吧
#31
HashSet 实现了Set接口,这样写就代表多态咯!
#32
顶
#33
这样去理解会十分简单··
我需要一只动物··首先需要的是一条狗··但是或许一下我就需要一只猫··所以我创建一个动物的对象··这个动物对象指向一条狗···也就是:Animal a=new Dog()..
我需要一只动物··首先需要的是一条狗··但是或许一下我就需要一只猫··所以我创建一个动物的对象··这个动物对象指向一条狗···也就是:Animal a=new Dog()..
#1
Set s = new HashSet();
用HashSet实例化一个Set
用HashSet实例化一个Set
#2
多看看java基础。。面向接口的编程。。对以后软件的可扩展和灵活性有好处。。
#3
接口编程
#4
接口类型的变量指向实现类的对象,这就是多态,or 面向接口编程or动态绑定。
#5
实例化HashSet的一个对象
#6
恩,是多态,开始学的时候我也不理解,用的多了就知道了
Set s = new HashSet();
s虽然是声明为Set类型,但实际上是指向了HashSet()对象
Set s = new HashSet();
s虽然是声明为Set类型,但实际上是指向了HashSet()对象
#7
HashSet是继承Set的,当然可以new出HashSet实例了。
#8
+1
#9
楼主基础还薄弱了点,再去看看什么是封装、多态、继承吧。
#10
你多看看基础哦 ,这个叫 里氏替换原则
#11
Set s = new HashSet();
这种实例化方法是java多态的一种表现!面向对象编程为了增加灵活性所以提出了面向接口或面向抽象编程!
上面得灵活性表现为,只要实现了接口Set的对象都可以赋值给s!
这种实例化方法是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
+1
#15
父类的引用指向子类的实例,是java的多态。举一个小例子你就明白了:假如牛是一个父类,其子类有奶牛、黄牛、黑牛、白牛等等,那么你可以说一只牛(父类的引用)是黑牛(子类的实例),之所以不用父类的实例,主要原因是此时的父类是一个接口,不能实例化(实际上实例化了也没有用,因为接口只定义了方法和属性,但是没有方法的实现,我们调用如何类都是为了调用它的方法,当然有些常量类也是为了调用其定义的属性)。所以这里要用父类的引用指向子类的实例,只有子类才实现了接口的方法,调用子类的方法才是有效的。
#16
父类引用指向子类对象 很经典的面向对象特征
#17
多态!多态!
父类引用指向子类对象
父类引用指向子类对象
#18
这就是父类引用指向子类对象,其中Set是父类,HashSet是子类,这一点你看看继承就应该懂了
#19
正解
#20
首先HashSet是实现了Set接口
所以说Set是HashSet的父类
java的多态性就有这么一点 父类的引用可指向子类对象
即 Set s = new HashSet();
比如说有个Person类 他有两个子类 分别是Man和Women类
你可以说Man是person 也可以说Women是Person
所以用子类来实例化父类 就是将子类的对象赋值给父类的应用
这样做的好处是 你只要声明一个Person类的引用 就可以用来接收Women和Person类的对象 否则你要分别声明Women和Person的引用 在分别实例化
所以说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接口。
s虽然是声明为Set类型,但实际上是指向了HashSet()对象
也就是hashset是实现了set接口。
#22
这个讲的比较详细
#23
接口正是这门语言的精髓所在,楼主应多研究。
#24
典型的父类引用指向子类对象,这是多态,虽说Set是个借口,但是HashSet实现了这个借口,就可以这么写的。。。。。。
#25
父类对象 引用 子类对象
多态的一种表现.......
多态的一种表现.......
#26
这样写是科学的写法,便于以后扩展,接口类型的变量可以用实现该接口的类实例化!
#27
接口是可以被一个实现了接口的类实例化的。Set s = new HashSet();
HashSet()返回一个实例化的Set接口对象。面向对象的多态性啊。楼主还是多看看书吧
HashSet()返回一个实例化的Set接口对象。面向对象的多态性啊。楼主还是多看看书吧
#28
面向接口编程 多台 动态绑定
飘过...
飘过...
#29
是Java多态。。。
#30
多看看基础吧
#31
HashSet 实现了Set接口,这样写就代表多态咯!
#32
顶
#33
这样去理解会十分简单··
我需要一只动物··首先需要的是一条狗··但是或许一下我就需要一只猫··所以我创建一个动物的对象··这个动物对象指向一条狗···也就是:Animal a=new Dog()..
我需要一只动物··首先需要的是一条狗··但是或许一下我就需要一只猫··所以我创建一个动物的对象··这个动物对象指向一条狗···也就是:Animal a=new Dog()..