【问题标题】:How java recognizes that both objects are of same typejava如何识别两个对象属于同一类型
【发布时间】:2017-08-13 09:22:19
【问题描述】:

例如,为了数据安全,我创建了一个类,例如 ModelClass 并定义了一些属性和方法,并定义了一些类似的列表 @ 987654322@ 那么java如何知道我传递的是真正的ModelClass,它是否比较ModelClass的所有方法和属性以及我传递的对象结果,我是java如何确定2个对象是相同的type 它是否比较所有字段和方法以知道它们是同一类型,

是的,我知道当我定义类型时,它们属于同一类型时会具有相同的对象是方法,但是当我们将对象作为多态对象传递时会发生什么

当我学习改造时,我从这里得到了这种感觉,在改造时我们得到这样的回应:

public void onResponse(Call<MoviesResponse>call, Response<MoviesResponse> response) {
            List<Movie> movies = response.body().getResults();
            Log.d(TAG, "Number of movies received: " + movies.size());
        }

MovieResponse 具有相同的字段名称,响应对象返回 here

【问题讨论】:

  • 您描述的是“鸭子打字”。 Java 使用静态类型。对象知道它是什么类,以及该类的超类型一直到 Object,所需的类型必须是其中之一或已实现的接口。

标签: java android oop polymorphism type-safety


【解决方案1】:

每个对象都有一个确切的类的记录,您可以通过在所述对象上调用getClass() 方法来查看。这包括类的全名(包括包),以及有关字段、方法、超类、接口等的信息。

在您的情况下,它所做的只是比较这些 Class 对象以确保它们兼容。

【讨论】:

  • 如果我定义类 A 并且我在其中定义了一些字段,如姓名、年龄、国籍并创建了它的对象,然后分配给它一些其他具有相同字段的对象,将会命名,年龄、国籍是否复制到 A 类对象?
  • 你刚才描述的不会编译。仅仅因为它具有与A 相同的字段、与A 相同的方法,并不一定使其成为A。 Java 会在编译时拒绝这样的尝试。
【解决方案2】:

进行类型检查最多的组件是 Java 编译器,它拥有完整的源代码可供使用,因此它可以简单地检查声明的变量类型。 (对于某些库,您可能没有源代码,但类文件也包含此类型信息。)

例如在代码sn-p中

public void add(ModelClass a) {
    results.add(a);
}

编译器知道results 是对List&lt;ModelClass&gt; 的引用,而a 是对ModelClass 的引用,因为它们是在源代码中定义的。所以它接受这个代码为有效的。在这种情况下,在运行时不需要进行类型检查。

在某些情况下,特别是当您使用instanceof 运算符或显式转换时,JVM 必须在运行时执行类型检查。为此,每个 Java 对象都知道自己的类。您可以通过调用对象的getClass() 方法来获取对象的类。

请注意,编译器检查变量的定义类型,而在运行时检查对象的类型(编译器无法知道)。后者始终是前者的子类型。此外,由于历史原因,在运行时泛型类型信息会丢失。所以results.getClass() 将返回ArrayList.class(或另一个List 实现),而不是List&lt;ModelClass&gt;.class(或类似的东西)。

【讨论】:

    【解决方案3】:

    要了解该过程,您需要了解两件事: 如何获取给定对象的类信息以及如何比较其中的两个。

    那么java到底是怎么知道对象类的呢?

    在运行时,类与其他所有对象都是相同的对象。每个公共对象都存储对类对象的引用。每个类都存储对其超类的引用。

    要将对象存储在 List&lt;Movie&gt; 对象类型应直接为Movie 或者它可能是它的后继。 有两个班级,如果一个是相同的,或者至少是另一个的继承者,你怎么看?

    运营商instanceof,就是这样!

    final Movie a = new Movie(...);
    final String b = "Not a Movie";
    
    a instanceof Movie; // expression is true
    b instanceof Movie; // false
    

    假设你有类层次结构

    Object(0) -> Video(1) -> Movie (2) -> HollywoodMovie (3)

    还有代码

    final HollywoodMovie a = new HollywoodMovie(...);
    a instanceof Video; // true, how it works?
    

    第二行的instanceof 将执行以下步骤:

    1. 检查a 的类型在类层次结构中是否至少有两个节点(因为Video 在它自己的层次结构中排在第二位)
    2. 如果上一个为真,则检查第二个节点是否为Video

    这是instanceof 工作的近似值

    【讨论】:

      【解决方案4】:

      我认为,当您将一个对象添加到 ListModelClass> results 时,第一个操作是类型检查,例如 if(object instanceof ModelClass){...}

      【讨论】:

      • 不,不是。有一个编译时检查。
      猜你喜欢
      • 2013-07-17
      • 2012-05-18
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 2013-04-26
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多