Java 实现接口时对象的类型

Java 实现接口时对象的类型,java,Java,下面是我的代码 没那么复杂 这里我想了解,在类D中,b是一个接口类型变量,在该变量中,我们存储了对实现该接口(b)的类(C)的新对象的引用。我们如何将类型C的对象分配给接口B类型变量B。。?类和接口都是不同的类型,那么,当我们在类上实现接口并且我们能够做到这一点时,它的特殊性是什么呢?这是我的问题 public interface A { } public interface B { public A methodABCD(); } public class C implemen

下面是我的代码

没那么复杂

这里我想了解,在类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();
  }
}
这是有效的

B b = new C();
只是因为C实现了接口B,所以您告诉编译器:


“我需要一个对象B,它可以做一些事情,而不是做一些事情…”,这种方法称为编程到接口,并允许您为类F更改类C,只要F也能做些事情,这是一种更灵活的设计…

您可以在java中将接口用作引用类型。 它只能引用那些实现该接口的类的对象。 但请记住,使用接口作为引用,您只能访问在该接口中声明的那些方法。您的类可以定义其他方法,但使用接口引用无法访问这些方法

在某种程度上,当你说类和接口属于不同类型时,你是对的,但当一个类实现一个接口时,它为该接口中声明的所有方法提供了定义,因此该接口可以引用实现类对象

这有点像继承

当一个类实现一个接口时,它被绑定在一个契约下,以提供对所有方法的实现。
因此,当一个接口引用一个类对象时,您可以非常确定该类必须已经实现了该接口,因此您的所有方法声明现在都有可以调用的定义。

好,让我们举个例子来说明它

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 
你的想法成为可能,因为它们属于同一类型。想象一下没有动物界面,看看把人变成狗是多么困难


您可以看到类型变化的灵活性和优势。您可以这样做,因为它们都只是一个接口。

Java隐藏了在堆中创建的对象的内存地址。对象由引用访问。一个对象可以有多个引用。使用
=
操作符引用可以引用对象,使用
操作符引用可以调用对象的特定行为。引用和对象存储在不同的内存位置

如果存在类
C
的对象
X
,则根据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
类型的引用,因为它们不属于更高层次结构

这是因为其中一个设计原则,Liskov取代基原则,L不稳定,
如果B是P的一个子类型,那么P类型的对象可以替换为B类型的实例化。有关详细信息,请在google上搜索SOLID design principles。一种面向对象的语言遵循这一点

我的问题是B和new C()如何具有相同的类型。。。?这是因为实现……我想理解这个概念……?不是因为它们是同一类型。。。是关于你正在声明的引用…检查你的对象b,确认你不能从类C调用方法,只能从接口调用方法。你的意思是我在接口类型变量b中存储类C对象的位置。。?如果是,那么引用变量和对象类型是否相同并不重要。如果定义的引用变量的类型是接口,则分配给它的任何对象都必须是实现该接口的类的实例。这是一个java语言规范。Java语言的开发人员就是这样做的。无论类扩展或实现什么类型,它都属于这种类型。接口和类有多种类型。I@Jay所以你的意思是整个类变成了它实现的类型。。?在我的代码中,新的C()是B接口类型…这就是你的意思…?是的。没有什么可学的。更好地学习设计模式,面向对象