当前位置: 首页 > 知识库问答 >
问题:

在java中创建接口对象

冯阳华
2023-03-14

我遇到了一些Java代码:

public class LocationProvider {

   public interface LocationCallback {
      public void handleNewLocation(Location location);
   }

   // class constructor
   public LocationProvider(Context context, LocationCallback callback){ 
      ...
   }
}

在Java中,我第一次遇到一个构造函数或方法,它的参数是一个接口的“类型”。可以创建接口的对象吗?你能像普通物体一样使用它们吗?

在C语言中,我知道创建抽象类的对象是不可能的。

共有3个答案

羊毅庵
2023-03-14

您正在混淆引用的类型和被引用对象的类型。

将类实例化为对象和具有给定类型的引用是两码事:

>

  • 实际上,您不能实例化接口。这意味着:

    • 你不能调用new MyInterface()
    • 任何对象都不会有类型MyInterface(请记住,我在这里谈论的是对象,而不是对它的引用)。

    相反,引用可以具有它所引用的对象类型的超类型的任何类型。给定类型的超类型是:

    >

  • 对象类的所有超类
  • 对象的类或其超类实现的所有接口

    这被称为类型的多重继承。

    另一种看待它的方式:

    • 无法实例化接口
    • 但接口是有效的类型

    在代码中,这意味着:

    MyInterface i; // This is valid, only says that the type of i is MyInterface
    i = new MyInterface(); // This is not valid, cannot instantiate the interface
    

    您可以在这里了解引用类型和对象类型之间的区别。

    举个例子,使用Integer类,它扩展了Number类,并实现了可序列化类:

    Integer i = new Integer(1); // The object referenced by i is of type Integer, forever
                                // i is a reference to that object,
                                // its type is a reference to Integer
    Number n = i; // Now n is also referencing the same object.
                  // The type of n is a reference to a Number. 
                  // The referenced object hasn't changed, its type is still Integer
                  // This is possible because Number is a supertype of Integer
    
    Serializable s = i;  // Same, s is now referencing the same object.
                         // The object is still the same, its type hasn't changed
                         // The type of s is a reference to a Serializable.
                         // This is possible because Serializable is a supertype of Integer
    

    构造函数定义

    public LocationProvider(Context context, LocationCallback callback)
    

    要求第二个参数是对LocationCallback的引用。

    这并不意味着引用的对象应该是那种类型,事实上这是不可能的。它只意味着传递的引用应该是LocationCallback的子类型,最终引用其类型是实现LocationCallback的类的对象。

  • 史智志
    2023-03-14

    好啊让我们复习一下基本知识:)。

    class A implements X{// where X is an interface
    }
    
    class B implements X{
    }
    

    现在,我们有了

    void someMethodAcceptingInterfaceX(X someInstanceOfX)
    {
    //do something
    }
    

    现在你可以做,

    X a = new A();
    X b = new B();
    someMethodAcceptingInterfaceX(a);
    someMethodAcceptingInterfaceX(b);
    

    也就是说,您可以传递任何接口X。任何实现接口的类都被称为该接口的实例(在更广泛的上下文中)。

    谷出野
    2023-03-14

    您永远不会创建“接口类”的对象。您可以创建实现接口的类的对象,并将该对象作为参数传递给期望接口类型参数的方法

     类似资料:
    • 问题内容: 这段代码是如何工作的,我完全感到困惑。 问题答案: 使用该语法,您可以创建一个完全合法的匿名类。 在内部,匿名类被编译为它们自己的类,在封闭类的名称位于符号之前的地方称为该类。并为每个其他匿名类增加。这意味着正在创建以下类: 然后,编译中的代码以在内部使用新定义的匿名类:

    • 主要内容:打开新建Java接口向导,新建Java接口,查看新建的Java接口打开新建Java接口向导 新建 Java 接口向导可用于创建新的 Java 接口。有很多方法可以打开这个向导 : 单击“File”菜单并选择“New”→“Interface”。 右键单击包资源管理器并选择New> Interface。 单击工具栏中的类下拉按钮 ( ) 并选择接口 ( )。 在打开 New Java Interface 向导之前,如果可能,请选择要在其中创建接口的包,以便向导可以自

    • 打开新建 Java 接口向导 新建 Java 接口向导可以创建新的 Java 接口。打开向导的方式有: 点击 File 菜单并选择 New > Interface 在 Package Explorer 窗口中右击鼠标并选择 New > Interface 在工具条上的下拉框按钮中 () 选择 () 在打开创建 Java 接口向导前,最好选择好Java接口所属的包名,这样在创建 Java 接口时包名

    • 打开“新建Java接口向导” New Java Interface向导可用于创建新的Java接口。 有很多方法可以打开这个向导 - 单击“文件”菜单,然后选择“新建”→“界面”。 右键单击包浏览器并选择“新建”>“界面”。 单击class下拉按钮( )在工具栏中选择界面( )。 在启动New Java Interface向导之前,如果可能,请选择要在其中创建接口的程序包,以便向导可以自动为您填写程

    • 我试图创建像@repository这样的系统。

    • 把大象装进冰箱分几步?三步:把冰箱门打开,把大象装进去,关门,搞定~ 新建接口分几步?也是三步: 获取权限 找到一个项目 新建接口 搞定~ 获取权限 新用户登录拥有 个人空间 分组下的全部权限,个人空间分组仅自己可见,因此可以在这里任意试用 YApi 的功能。 除此以外没有任何项目或分组的权限,只能浏览已存在分组下面的公开项目。 如果找不到想找的项目,可能是尚未成为项目成员,此时应联系 项目组长