在Java中,一个类只能从一个类继承,但它可以实现 多个界面。因此,对象可以有多种类型: 他们自己的类的类型和所有接口的类型 他们实施。这意味着如果声明变量是 接口的类型,其值可以引用任何对象 从任何实现接口的类实例化。
任何人都可以为我提供基本的伪类型。我不明白粗线。
答案 0 :(得分:54)
让我们声明两个接口和一个实现它们的类:
interface I1 { }
interface I2 { }
class C implements I1, I2 { }
对象可以有多种类型
在以下代码中,可以看出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
现在让我们声明一个实现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"
还的类型为Serializable
,CharSequence
和其他类型。
实际上,我们是否应该说"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
接口的类的对象,例如, ArrayList
,Stack
,...有关更多示例,请参阅链接的文档。