“Java子类型”和“真实子类型”之间的区别是什么?

时间:2012-02-05 17:45:10

标签: java subtype

我刚刚遇到短语" java子类型"和"真正的子类型"。它以某种方式提出,表明它们相同。但是,我无法找到两者之间存在差异的解释。

有人可以解释" java子类型"之间的区别和"真正的子类型"?

3 个答案:

答案 0 :(得分:8)

java子类型是扩展另一个类(甚至实现接口)的任何类。真正的子类型不是语言特定的:

真正的子类型总是可以替代超类型。 “超类型保证的任何财产必须由子类型(真正的子类型)保证”

http://www.cs.washington.edu/education/courses/cse331/10au/lectures/subtypingexamples.pdf

该链接包含一个非常有启发性的示例。假设您有一个存储值x和y的Point2D类。您现在可以创建一个子类型Point3D并添加一个值z。如果不覆盖任何方法并使用equals和hashcode方法,则可以随时用Point3D实例替换Point2D实例。

这是一个简单的例子。有人可能会争论为什么不只有Point3D。也许这些类都提供了一些方法,可以通过分成类来更好地被认为属于2D或3D领域。在这种情况下,它可能纯粹是一个设计决定。

class Point2D {
   int x;
   int y;
}

//true subtype
class Point3D extends Point2D {
   int z;
}

如果您使用Person类,然后有两个子类型:Employee和Customer,则可能会出现更复杂的示例。 Employee和Customer都提供与Person相同的字段和方法。

class Person {
   String name;
   Date birthday;

   @Override
   public boolean equals(Object o){
       //simplified equals implementation, this does not fulfill equals contract!
       return name.equals(((Person)o).name);
   }
}

//true subtype, same behaviour
class Employee extends Person {
   long departmentId;
}

//not a true subtype, different behaviour -> equals
class Customer extends Person {
   long customerId;
   Date lastContact;
   String city;

   public boolean equals(Object o){
       //simplified equals implementation, this does not fulfill equals contract!
       return customerId.equals(((Customer)o).customerId);
   }
} 

在此示例中,Employee将是Person的真实子类型。但是,Customer不是真正的子类型,因为equals实现不同(并且可能也是hashCode())并且它的行为不会相同,并且可能无法始终替换Person对象。

答案 1 :(得分:0)

答案 2 :(得分:-1)

请参阅解释其差异的图片。

Java Subtype Vs True Subtype

因为 Human 类具有类脊椎动物的类似行为,即使它没有使用 extends implements < / strong>关键字。这称为 True Subtype 。而 Squid 类正在使用 extends 关键字扩展 Vertebrate 类,该关键字称为 Java子类型