2017-08-13 195 views
1

例如为了数据安全我创建了一个类,例如ModelClass,并定义了一些属性和方法,并定义了一些像这样的列表 private List<ModelClass> results;然后java如何知道我所传递的是真的ModelClass,它是否比较ModelClass的所有方法和属性以及我在结果中传递什么对象,我是如何确定2个对象是相同类型的,它比较所有字段和方法,以便知道它们是同一类型,java如何识别这两个对象是相同的类型

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

我从这里这种感觉,当我学习改造,在改造的时候,我们得到的响应它像:

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

+0

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

回答

0

每个对象都有一个记录相同的字段名称确切地说它是什么类,你可以通过在所述对象上调用getClass()方法来看到它。这包括类的全名(包括包),以及有关字段,方法,超类,接口等的信息。

在你的情况中,它确实是比较这些Class对象以确保它们是兼​​容的。

+0

如果我定义了A类,并且已经定义了其中的一些字段,如名称,年龄,国籍并创建了它的对象,然后为其分配了一些具有相同字段的对象,那么将名称,年龄,国籍复制到A类目的? – blackHawk

+0

更新了我的问题 – blackHawk

+0

刚刚描述的内容不会编译。仅仅因为它具有与'A'相同的字段,与'A'相同的方法并不一定使它成为'A'。 Java将在编译时拒绝这种尝试。 –

-1

我想,当你添加一个物体到列表< ModelClass>结果,第一个动作是类型检查就像if(object instanceof ModelClass){...}

+0

更新了我的问题 – blackHawk

+0

不,它不是。有一个编译时检查。 – EJP

0

这确实是最类型检查是Java编译器的组成部分,它拥有完整的源代码,因此它可以简单地检查声明了哪些类型的变量。 (对于某些库,你可能没有源代码,也是类文件包含此类信息。)

例如,在代码片段

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

编译器知道results是一个参考List<ModelClass>a是对ModelClass的引用,因为这是它们在源代码中的定义方式。所以它接受这个代码是有效的。在运行时,在这种情况下不需要执行类型检查。

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

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

0

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

那么java如何知道对象类呢?

在运行时,类和其他所有对象一样。每个公共对象都存储对类对象的引用。每个类都存储对它的超类的引用。

要存储的物体在List<Movie>对象类型应该直接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工作的近似值

相关问题