2012-08-13 60 views
2

通常,当你创建一个对象,你在前面 等提供的同类型:不同的语法创建的HashMap和TreeMap对象

Scanner scanner = new Scanner(System.in); 

但在宣布一个HashMap对象和TreeMap遵循不同的语法是这样的。

Map m1 = new HashMap(); 
SortedMap sm = new TreeMap(); 

是什么原因?我问我的教授。但他不知道答案。

+0

http://stackoverflow.com/questions/383947/what-does-it-mean-to-program-to-an-interface – 2012-08-13 05:47:54

+0

谢谢。现在阅读。 – Nicholas 2012-08-13 05:51:08

+0

顺便说一下,你也可以这样做:'Map sm = new TreeMap ()“这就表示你想要排序键,但实际上并不需要任何利用它的方法。情况是,如果代码只需要输入/获取条目,但是您打算以易于阅读的方式将其打印出来,方便按顺序打印条目。 – yshavit 2012-08-13 06:13:23

回答

5

但声明一个HashMap对象和TreeMap遵循这样的不同语法。

你不要到。您可以写:

HashMap<String, Integer> map = new HashMap<String, Integer>(); 

...它只是你做不出来。

同样,你写:

Object scanner = new Scanner(System.in); 

基本上有两种类型的参与:

  • 类型,也宣告
  • 类型的变量,其构造你”重新打电话

他们没有必须是相同的,但构造类型必须是分配兼容与变量类型。它必须是一个超类或该类支持的接口。只将Map(或List或其他)变量指定为接口类型的要点是,大多数代码只应将其视为map/list/set/whatever。其实是一个HashMap(或ArrayList等)的事实是一个实现细节。请参阅"programming to an interface"了解更多详情...但留意识到语法是一样的在两种情况下:

VariableType variableName = new ActualTypeBeingConstructed(); 

我问我的教授。但他不知道答案。

这让我害怕......

+0

感谢您的答案。我正在看那个线程。 – Nicholas 2012-08-13 05:58:20

1

SortedMap是一个接口,所以你不能实例化它。这就是为什么我们创建一个子类对象TreeMap,它实现了这个接口并将其分配给接口对象SortedMap,以便它可以使用子类和父类两个类的函数。

+0

有趣的是,当我声明时发生了什么这些对象。谢谢。 – Nicholas 2012-08-13 05:54:49

2

Map是一个接口(或更一般的类) - TreeMap是实现Map(或更具体的类)的东西。

例如List是一个通用接口,ArrayList的实现列表,所以你可以说

List<Obj> list = new ArrayList<Obj>(); 
// or 
ArrayList<Obj> list = new ArrayList<Obj>(); 
// but not 
ArrayList<Obj> list = new List... 

如果你的教授真的不能回答这个问题,你真的需要得到一个新的教授!

+0

他是一位很好的教授,感谢您的回答。 – Nicholas 2012-08-13 05:53:20

+1

假设学科是编程或计算机科学或其他东西。如果教授可以回答但希望您自己找出答案,好的,我会买它。如果教授认真回答不了,那么:不。他可能是个好人,但他不知道题材,不适合教它! – John3136 2012-08-13 05:57:04

+0

你有一个点。 – Nicholas 2012-08-13 05:59:24

1

还可以声明

HashMap m1 = new HashMap(); 
TreeMap sm = new TreeMap(); 

地图是由HashMap的(和TreeMap)实现的接口。您可以将任何实现Map接口的对象分配给一个映射为decalared的变量。类似于接口TreeMap。

在java中你有一个类和接口的层次结构。一类是分配给任何“父”类它实现

一个更复杂的例子任意一个接口是Swingclass JTextField的 这里的层次结构是

Component 
    Containter 
    JContainer 
     JTextComponent 
      JTextField 

所以

Component c1 = new JTextField(); 
Containter c2 = new JTextField(); 
JContainer c3 = new JTextField(); 
JTextComponent c4 = new JTextField(); 

都完美有效。 JTextField是一个JTextCompent,JContainer,容器和组件。