无法理解java中的界面

时间:2013-07-22 09:21:41

标签: java interface

我正在查看Java网站上提供的Interface章节 Using Interface as a type
所以我的理解是接口的全部意义在于它就像一个类,但是不可能从它形成对象,但是这个页面说明了如何使用接口作为数据类型。行Relatable obj1 = (Relatable)object1;似乎创建了一个类型为Relatable的对象,它是一个接口。虽然我必须说这里没有使用new关键字,因此并没有真正创建对Relatable类型对象的引用。这是否真的导致此行没有创建Relatable类型的对象?

再次,它进一步说

  

如果您要在各种各样的实施中实现Relatable   类,从这些类中的任何一个实例化的对象都可以   与findLargest()方法进行比较 - 前提是两个对象都是   同一类。

这是什么意思?这是否意味着实现Relatable的所有内容都可以调用findLargest()?如果是这样,为什么会说provided that both objects are of the same class

-----编辑-----
从本教程的前几章开始:
相关的定义:

public interface Relatable {

    // this (object calling isLargerThan)
    // and other must be instances of 
    // the same class returns 1, 0, -1 
    // if this is greater // than, equal 
    // to, or less than other
    public int isLargerThan(Relatable other);
}  

使用relatable作为类型:

public Object findLargest(Object object1, Object object2) {
   Relatable obj1 = (Relatable)object1;
   Relatable obj2 = (Relatable)object2;
   if ((obj1).isLargerThan(obj2) > 0)
      return object1;
   else 
      return object2;
}

-----编辑2 -----
在关于匿名类的章节中,它是这样做的:

public class HelloWorldAnonymousClasses {

    interface HelloWorld {
        public void greet();
        public void greetSomeone(String someone);
    }
.
.
.
 HelloWorld englishGreeting = new EnglishGreeting();

        HelloWorld frenchGreeting = new HelloWorld() {
            String name = "tout le monde";
            public void greet() {
                greetSomeone("tout le monde");
            }
            public void greetSomeone(String someone) {
                name = someone;
                System.out.println("Salut " + name);
            }
        };

那么这是如何工作的?

5 个答案:

答案 0 :(得分:4)

  

行Relatable obj1 =(Relatable)object1;似乎创建了一个Relatable

类型的对象

没有。此行创建Relatable类型的引用(obj1),并将其分配给object1。为了实现此目的,object1必须强制转换到(接口)类型Relatable
这里没有创建新对象。

  

这是否意味着任何实现Relatable的东西都可以调用findLargest()?

  

如果是这样的话,为什么说两个对象属于同一类?

它与isLargerThan()的实施有关。由于任何实现Relatable接口的类都无法了解实现它的其他类,因此无法与其他类进行有意义的比较。因此,为了使其工作,两个对象都需要属于同一类。

对编辑2的回应

  

那么这是如何运作的?

而不是首先定义一个类然后创建它的实例,就像EnglishGreeting的情况一样,frenchGreeting是动态创建的。在封面下发生的是,创建了一个实现HelloWorld的新类,就像在英语中一样,只是这次它是匿名的(你永远不会给它一个名字)。当您需要一次性实现接口时,它只是一个方便的快捷方式。

答案 1 :(得分:3)

接口类型属于java中引用类型的类别。您永远不能实例化接口,但可以为其分配对实现它的任何类对象的引用:

  

声明类型为接口类型的变量可以具有   value一个对实现该类的类的任何实例的引用   指定的界面。

接口就像行为。如果一个类碰巧实现了一个接口,让我们说Serializable,这会给类添加一个行为,也就是说,类可以被序列化。

这有助于您在代码中引入抽象。例如,假设您需要一个实用程序类中的方法,该方法将负责序列化的实际工作。如果没有接口,您将最终编写许多方法,每个方法对应要序列化的每种对象类型。现在想象一下,如果你要求每个对象自己处理它们的序列化(通过实现在它们实现的接口中声明的serialize方法)。通过这种实现,您只需要编写一个用于序列化的实用方法。此方法可以采用Serializable类型的参数,并且可以将实现此接口的任何类的实例传递给该方法。现在,在方法中,您只需要在接口变量上调用serialize方法。在运行时,这将导致调用实际对象的serialize方法。

希望我能够保持简单。

答案 2 :(得分:2)

接口只是一个定义对象行为的类,而不是它的底层实现。 通过创建Relatable obj1 = (Relatable)object1;,您只需将object1转换为Relatable类型,因此您可以调用Relatable接口中定义的任何方法

答案 3 :(得分:2)

Java 中的

接口是实现接口的类的相互结构,因此类以自己的方式受益于该接口的方法/其他成员,被称为多态性,

interface A
{
  // method header only declared here, so implementation can vary between classes
  public int foo(); 
}

class B implements A
{
   public override String foo()
   {
     return "Class B";
   }
}

class C implements A
{
   public override String foo()
   {
     return "Class C";
   }
}

因此您可以从foo()class B致电C,但他们会以不同的方式做出反应,因为他们以自己的方式实施该方法

答案 4 :(得分:1)

关于Relatable obj1 = (Relatable)object1;的第一个问题:

简单Relatable obj1;不会创建Relatable实例,但指定分配给它的任何对象必须是实现Relatable接口的类型。

因此,任何要转换的对象必须是实现Relatable接口的类型。