【问题标题】:Calling an Instance Method of an Interface Directly直接调用接口的实例方法
【发布时间】:2016-10-01 05:29:26
【问题描述】:

我是 Java 新手。几周前开始,依靠 oracle 文档和这个站点。渐渐地,我对 OOP 的主要概念有了很好的理解。

我很清楚,接口的实例方法成为实现类的实例方法,因此可以通过实现类的对象在实例化后调用。

接口 Set 有方法 iterator()。据我了解,我们需要先有一个实现 Set 接口的类,然后实例化该类的对象,以便能够(通过对象)调用该方法。

查看我在网上阅读的以下代码 sn-p,我注意到 iterator() 方法是通过 (set) 调用的,它的类型仅为 (Set interface),(即 set 不是实例任何实现 Set 接口的类)。

我的问题是:这可能吗?

另一方面,不管上述是否可行,根据 oracle 文档,方法 iterator() 被归类为 Set 接口的“实例”和“抽象”方法。那么,为什么只有默认和静态接口方法才有实现呢?

public static void main(String args[]) {

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

  hmap.put(12, "Chaitanya");
  hmap.put(2, "Rahul");

  /* Display content using Iterator*/
  Set set = hmap.entrySet();
  Iterator iterator = set.iterator();
  while(iterator.hasNext()) {
     Map.Entry mentry = (Map.Entry)iterator.next();
     System.out.print("key is: "+ mentry.getKey() + " & Value is: ");
     System.out.println(mentry.getValue());

【问题讨论】:

    标签: java oop interface instance


    【解决方案1】:

    是的,这是可能的。

    设置设置; 这里,set 只是一个引用变量。

    如果我们有一个接口说,'interface1',那么下面的将是不允许的:

    interface1 object=new interface1();

    但是如果Class1实现了interface1,那么

    interface1 ref=new Class1() 和

    Class1 ref=new Class1(),

    上面的'ref'都可以用。

    另外,您必须知道,接口的所有方法默认都是公共的和抽象的,并且所有抽象方法必须实现。

    希望这能回答你的问题。

    【讨论】:

    • 您能否详细说明您的最后一段。我所知道的是,从 SE8 开始,接口默认方法和静态方法确实有实现(不是抽象的)。回到上面的代码,iterator() 方法运行良好,但没有被覆盖。
    【解决方案2】:

    阅读方法如下:

    Set set = hmap.entrySet();
    Iterator iterator = set.iterator();
    

    hmap.entrySet 将一个对象 返回到实现 Set 接口的set 变量中。这意味着set 实现了 Set 接口中声明的所有方法。因此,针对set object 调用iterator() 方法是完全可以的,因为它是Set 接口的方法之一。

    set 是一个对象,它实现 Set 接口。它不是一个接口。这里唯一的接口是Set

    【讨论】:

    • "set is an object that implements [...]" 误导性陈述 - 尤其是对于初学者。变量不是对象。它只是一个。变量的类型有两个含义: 1)它限制了被引用对象的运行时类型。 2) 它限制了你可以调用的方法。
    • 另一个奇怪的措辞:“hmap.entrySetobject 返回到 set 变量 [...]”。它不返回一个变量。对hmap.entrySet() 的调用返回对对象的引用(即Set),并且此引用分配给变量。
    • 当人们试图辨别类和接口之间的区别时,引用有点太早了。您对变量类型的描述是正确的,但是在这一点上根据约束来描述类型也有点复杂,您不觉得吗?
    • 不,我认为对初学者来说最好的是尽可能精确并使用正确的术语。其他一切都更令人困惑。此外,像“set is an object”这样的陈述是完全错误的。
    • 回去看足球,我看到语言律师今晚出去了......
    猜你喜欢
    • 2020-02-20
    • 2020-06-07
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2014-10-01
    相关资源
    最近更新 更多