以下是我的代码......
它并不复杂。
这里我想要理解,在类D中,b是一个接口类型变量,在该变量中,我们存储对实现该接口(B)的类(C)的新对象的引用。我们如何能够将类型C的对象分配给接口B类型变量b ..?类和接口都有不同的类型,然后当我们在类上实现接口时它是特殊的,我们能够做到这是我的问题
public interface A {
}
public interface B {
public A methodABCD();
}
public class C implements B {
final A typeA;
public A methodABCD() {
return typeA;
}
}
public class D {
static private B b;
static public A methodABCD() {
if (b == null) {
b = new C();-------------->How..?
}
return b.methodABCD();
}
}
答案 0 :(得分:2)
好的,我们举一个例子说明一下。
interface Animal {
public void eat();
}
class Human implements Animal{
public void eat(){
// Eat cakes and Buns
}
}
class Dog implements Animal{
public void eat(){
// Eat bones
}
}
现在让我们看看如何使用它们
Animal h = new Human();
Animal d = new Dog();
现在在某些时候你可能想要改变你的人类以像狗一样行事。
h =d;
h.eat();// Eat bones
你的想法成为可能,因为它们属于同一类型。想象一下,没有Animal界面,看看将人类转变为狗是多么困难。
您可以看到类型变化的灵活性和优势。你被允许这样做是因为他们都只是动物而不是接口。
答案 1 :(得分:1)
这是有效的
B b = new C();
只是因为 C 实现了接口 B ,所以你告诉编译器:
"我需要一个对象B 可以做某事而不是是 ...",这种方法叫做 编程到接口 ,只要F 能够做到,就可以让后者更改类 F 的类 C 一些东西,这是一个更灵活的设计...
答案 2 :(得分:1)
Java隐藏了在Heap中创建的对象的内存地址。对象由引用访问。一个对象可能有多个引用。使用=
运算符引用来引用对象,并使用.
运算符引用可以调用对象的特定行为。引用和对象存储在不同的存储位置。
如果存在类X
的对象C
,则根据Java语言规范,X
可以包含类型为C
或任何超级的引用高级层次结构中的类或C
实现的任何接口或更高层次结构中的任何超类或任何这些接口扩展的任何接口。
class A implements IA{}
class B extends A implements IB{}
interface IC extends IA{}
interface IB extends ID{}
class E{}
class F extends B{}
现在new B()
可以引用A
,B
,IA
,IB
,ID
,但不能引用类型E
,IC
,F
因为这些不属于较高的杠杆等级。
答案 3 :(得分:0)
您可以在java中使用interface作为引用类型。 它只能引用那些实现该接口的类的对象。 但请记住,使用interface作为引用,您只能访问在该接口中声明的那些方法。您的类可以定义其他方法,但使用接口引用无法访问。
在某种程度上,当你说类和接口是不同类型时,你是对的,但是当一个类实现一个接口时,它为该接口中声明的所有方法提供定义,因此该接口可以引用实现类对象。 / p>
有点像继承。
当一个类实现一个接口时,它在一个契约下绑定,为所有方法提供实现。 因此,当接口引用类对象时,您可以非常确定该类必须已实现该接口,因此您的所有方法声明现在都具有可以调用的定义。
答案 4 :(得分:0)
这是因为其中一个设计原则,Liskov Substituion Principles,L out of SOLID, 如果B是P的子类型,那么P类型的对象可以用类型B的实例替换。在谷歌上搜索SOLID设计原则以获取更多细节。面向对象的语言遵循这个