接口作为Java中的一种类型?

时间:2011-09-01 20:03:35

标签: java interface

来自The Java Tutorials

  

在Java中,一个类只能从一个类继承,但它可以实现   多个界面。因此,对象可以有多种类型:   他们自己的类的类型和所有接口的类型   他们实施。这意味着如果声明变量是   接口的类型,其值可以引用任何对象   从任何实现接口的类实例化

任何人都可以为我提供基本的伪类型。我不明白粗线。

11 个答案:

答案 0 :(得分:54)

让我们声明两个接口和一个实现它们的类:

interface I1 { }

interface I2 { }

class C implements I1, I2 { }
  

对象可以有多种类型

在以下代码中,可以看出C实例的类型为C以及I1I2

C c = new C();

boolean isC = (c instanceof C);   //true
boolean isI1 = (c instanceof I1); //true
boolean isI2 = (c instanceof I2); //true

现在让我们声明一个实现B的类I1

class B implements I1 { }
  

如果声明变量是接口的类型,则其值可以引用从实现接口的任何类实例化的任何对象。

如果我们声明类型为I1的变量,我们可以将其设置为C的实例,然后将其重新分配给B的实例:

I1 i1 = new C();
i1 = new B();

我们还可以将其重新分配给D的实例,其中D扩展C

i1 = new D();

...

class D extends C { }

答案 1 :(得分:11)

考虑以下示例:

Serializable s = new ArrayList();

在Java中,这是有效的代码,即使Serializable是一个接口,因为ArrayList实现了Serializable。因此,在这种情况下,我们将s视为Serializable类型的变量。

现在假设我们使用以下代码跟进上述代码:

s = "String object";

这也是有效的,因为String也实现了Serializable。由于我们将s声明为类型Serializable,因此它可以指向实现该接口的任何对象。

答案 2 :(得分:5)

对象可以有多种类型

请考虑以下代码段:

public class MyClass extends ParentClass implements Interface1, Interface2 {    
    //some code    
}

这个类可以在不同的地方使用,如下所示:

MyClass m1 = new MyClass();
ParentClass p = new MyClass();
Interface1 i1 = new MyClass();
Interface2 i2 = new MyClass();

变量被声明为接口的类型,其值可以引用从实现接口的任何类实例化的任何对象。

考虑前一个片段中的最后两行,Interface1类型的变量可以引用任何实现此接口的对象,所以如果我们有另一个类实现Interface1,比如说MyClass2,那么

Interface1 i1 = new MyClass();
Interface1 i2 = new MyClasss2();
i1 = i2;
i1 = new MyClass2();

所有以前的分配都是有效的,因为MyClass和MyClass2实现了Interface1

答案 3 :(得分:4)

class Ball extends Rubber implements Jumping, Rolling, Squeezing {
   public void jump(){}
   public void roll(){}
   public void squeeze(){}
}

Ball b = new Ball();
Jumping j = new Ball();
j.jump();

//j.roll();         //CTE: Cannot resolve method roll()
((Ball) j).roll();  //but it still can be called if explicit cast to type Ball is used

答案 4 :(得分:2)

你引用的语句(从哪里?)是真实的但是误导性 - 对象已经有多种没有接口的类型。

例如,"bimmelim"的类型为String,但其类型为Object。接口不会更改,除了"bimmelim" 的类型为SerializableCharSequence和其他类型。

实际上,我们是否应该说"bimmelim" “具有”类型Object可能是有争议的,但是对它的引用肯定会适合{{1}变量。

如果声明变量是接口的类型...例如

Object

...然后它的值可以引用CharSequence x ; 对象,例如String,或者它可能是"bimmelim",这是另一种实现StringBuffer的类型。

答案 5 :(得分:2)

String实现了多个接口,因此它有多种类型:

String s = "A String";
Comparable<String> comp = s;
CharSequece cs = s;
Serializable ser = s;

接口CharSequence由多个类实现,因此CharSequence引用可以包含所有类型的对象:

CharSequence cs = "A String";
cs = new StringBuilder();
cs = new Segment();

答案 6 :(得分:2)

  

对象可以有多种类型

示例:

public class Foo implements Runnable, Callable<Integer> {
  public void run() {}
  public Integer call() {return 1;}
}

Foo foo = new Foo();
Runnable r = foo;
Callable<Integer> c = foo;

示例:

  

如果变量被声明为接口的类型,则其值可以引用从实现接口的任何类实例化的任何对象

Runnable r = new Foo();
r = Thread.currentThread();   //Thread implements Runnable

答案 7 :(得分:2)

非常基本的例子 -

List<String> list1=new ArrayList<String>();

因为,ArrayList实现了List,所以我们可以使用List接口变量,即list1来引用Arraylist创建的对象。

答案 8 :(得分:1)

以下是正确的作业:

class AClass implements AInterface {
}


AInterface var = new AClass();

答案 9 :(得分:1)

考虑以下类和接口定义:

public class A { }

public class B extends A implements I { }

public interface I { }

以下陈述都是合法的:

A first = new A();
B second = new B();
A third = new B();
I fourth = new B();

因为B实现了I并扩展了A,所以它可以在任何“I”或“A”预期的任何地方用作值。

答案 10 :(得分:1)

以标准Java库中的Collection接口为例。然后,可以为声明为类型Collection的任何变量分配实现Collection接口的类的对象,例如, ArrayListStack,...有关更多示例,请参阅链接的文档。