【问题标题】:Difference between Reference Type and Object Type?引用类型和对象类型的区别?
【发布时间】:2013-12-12 15:51:50
【问题描述】:

Java 文档说:

当你定义一个新的接口时,你就是在定义一个新的引用 数据类型...[]

有些人使用“对象类型”这个名称来指代用于首先实例化对象实例的类。

因为我们不能使用接口来实例化一个对象,我可以说一个对象永远不会有那个接口的类型,但是如果它实现了那种接口,你可以使用那个接口类型的引用来访问那个对象?

维基百科说:

[]... 数据类型或简单的类型是识别其中之一的分类 各种类型的数据,例如实值、整数或布尔值, 确定该类型的可能值;可以的操作 在该类型的值上完成;数据的含义;和方式 可以存储该类型的值。

我不明白 Java 中的接口如何确定“该类型的可能值;可以对该类型的值执行的操作;数据的含义;以及该类型的值可以存储的方式。”我的理由是,因为接口没有定义方法可以做什么,所以它们不是数据类型,只有类和原始类型定义数据类型。接口仅定义在使用引用访问时如何使用某种数据类型的对象。

基于此,如果有人说实现某个接口的对象与该接口具有相同的类型,我可以回答他/她错了吗,因为接口只为引用提供类型,而对象永远不会具有接口?

【问题讨论】:

    标签: java types interface reference-type object-type


    【解决方案1】:

    您说“实现接口的对象具有与该接口相同的类型”是正确的。而且由于对象是类的实例,因此从技术上讲,它永远不会与接口具有相同的类型,因为接口无法在 Java 中实例化。一个接口可以被认为是一个类的蓝图。

    我能想到的最常见的实现之一是在 Java 集合中。

    Map<Integer, String> mapExample = new HashMap<Integer, String>();
    

    这里的Object Type是HashMap和Map的Reference类型(接口)。 HashMap 将继承 Map 中声明的方法并提供它自己的实现。

    我不明白 Java 中的接口如何确定“该类型的可能值;可以对该类型的值执行的操作;数据的含义;以及该类型的值可以存储的方式。”我的理由是,因为接口没有定义方法可以做什么,所以它们不是数据类型,只有类和原始类型定义数据类型。

    让我们用下面的例子来解决这个问题:

    public interface IHelloWorld {
    
       public String helloWorld(String world);
    
    }
    

    这里我有一个包含 helloWorld 方法的接口。我已经将访问器类型定义为public,我确保它会返回一个String 类型并且它会采用String 参数。所以它肯定可以定义一个方法可以做什么。任何实现此接口的类都需要提供 helloWorld 的实现细节。如果我要实现这一点,我会执行以下操作:

    public class HelloWorld implements IHelloWorld {
    
        public String helloWorld(String world) {
            return "Hello " + world;
        }    
    
    }
    

    您可以在这里看到,虽然我们在IHelloWorld 接口中没有实现细节,但我们定义了 helloWorld 方法将返回什么以及该方法将接受什么参数类型。

    我希望这可以为您澄清一些事情。

    【讨论】:

    • 我在某处读到一个界面用于隐藏某些细节。隐藏已经“隐藏”的东西是没有意义的,比如私有方法,因此,当我们要定义一个接口时,我们会列出我们希望通过我们的接口提供的类中已经公开的方法,并且我们通过它们的签名列出它们,因为这是引用方法的适当方式。
    • 我上一条评论有误。我想说的是“我们通过他们的声明列出它们”,而不是通过签名。
    猜你喜欢
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多