来自Java教程:
在Java中,类只能从一个类继承,但它可以实现多个接口.因此,对象可以有多种类型:它们自己的类的类型以及它们实现的所有接口的类型.这意味着如果将变量声明为接口的类型,则其值可以引用从实现接口的任何类实例化的任何对象.
任何人都可以为我提供一个基本的伪类型.我不明白粗线.
Pau*_*ora 57
让我们声明两个接口和一个实现它们的类:
interface I1 { }
interface I2 { }
class C implements I1, I2 { }
Run Code Online (Sandbox Code Playgroud)
对象可以有多种类型
在下面的代码,它可以看出,一个C
实例具有的类型C
以及I1
和I2
:
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
,它可以指向实现该接口的任何对象.
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)
对象可以有多种类型
请考虑以下代码段:
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