我正在查看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);
}
};
那么这是如何工作的?
答案 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)
接口是实现接口的类的相互结构,因此类以自己的方式受益于该接口的方法/其他成员,被称为多态性,
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接口的类型。