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

Joh*_*per 34 java interface

来自Java教程:

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

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

Pau*_*ora 57

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

interface I1 { }

interface I2 { }

class C implements I1, I2 { }
Run Code Online (Sandbox Code Playgroud)

对象可以有多种类型

在下面的代码,它可以看出,一个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
Run Code Online (Sandbox Code Playgroud)

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

class B implements I1 { }
Run Code Online (Sandbox Code Playgroud)

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

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

I1 i1 = new C();
i1 = new B();
Run Code Online (Sandbox Code Playgroud)

我们也可以将其重新分配到的实例D,其中D扩展C:

i1 = new D();

...

class D extends C { }
Run Code Online (Sandbox Code Playgroud)


Man*_*qui 11

请考虑以下示例:

Serializable s = new ArrayList();
Run Code Online (Sandbox Code Playgroud)

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

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

s = "String object";
Run Code Online (Sandbox Code Playgroud)

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


bra*_*boy 6

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
Run Code Online (Sandbox Code Playgroud)


K''*_*K'' 5

对象可以有多种类型

请考虑以下代码段:

public class MyClass extends ParentClass implements Interface1, Interface2 {    
    //some code    
}
Run Code Online (Sandbox Code Playgroud)

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

MyClass m1 = new MyClass();
ParentClass p = new MyClass();
Interface1 i1 = new MyClass();
Interface2 i2 = new MyClass();
Run Code Online (Sandbox Code Playgroud)

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

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

Interface1 i1 = new MyClass();
Interface1 i2 = new MyClasss2();
i1 = i2;
i1 = new MyClass2();
Run Code Online (Sandbox Code Playgroud)

之前的所有赋值都是有效的,因为MyClass和MyClass2实现了Interface1