创建一个基类与子类的静态类型的对象?

用户名

我无法弄清楚访问使用基类(对象)的对象的静态类型访问的子类的方法与使用子类(点)所访问的子类的方法之间的区别。
例如:

public class Point {
int x, y;
...
public boolean equals(Object o){
...
}

public boolean equals(Point p){
...
}
}


Object o = new Object();
Point p = new Point(3,4);
Object op = new Point(3,4);

// here the static type is Point and the dynamic type is point, in this case 
// the equals() method that we choose and gets overwrriten depends on the
// parameter type that is passed. 
p.equals(o);
p.equals(p);
p.equals(op);

// here however the static type is Object so we initially look at the equals() 
// method in our Object class during compile time and check its parameter type   
// which is Object, thus if we overwrite      
// the equals() method we will pick the one that has a type Object parameter. 
// Since the dynamic type of our object is Point, when we are at run time
// we will look for the  equals() method in Point that matches with the   
// method type Object parameter.

op.equals(o);
op.equals(op);
op.equals(p);

我没有看到的是为什么我要使用后一种而不是前一种来指定我要覆盖的方法?前者取决于类型参数,而后者则取决于对象的静态类型的类型参数。我只是看不到在我的子类中使用Basetype obj = new Subclasstype()来访问和覆盖方法的好处。它看起来更加复杂,并且该对象只能用于访问基类中子类中方法的实例,而不能访问子类中的任何其他方法。

马克·托波尼克(Marko Topolnik)
public boolean equals(Point p){
  ...
}

上面的方法与equals(Object)共享名称无关equals它不会覆盖它,不能从Object-typed变量调用它,没有由定义的协定Object

当你写

op.equals(p);

您正在调用该Object类型的方法equals类型中唯一调用的方法是,equals(Object)并且此选择是永久的运行时只能提供的不同替代equals(Object),但绝不会将调用路由到equals(Point)

同样,当你写

p.equals(op);

编译器会再次看到你调用equals带参数,其静态类型Object,选择equals(Object)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何创建一个静态类的“属性”对象?

来自分类Dev

如何链接到类类型创建另一个类类型的对象

来自分类Dev

快速从其基类返回一个子类

来自分类Dev

难道是明智的,有一个静态方法负责创建它驻留在类的对象?

来自分类Dev

如何访问在属于另一个类的静态对象中创建的列表?

来自分类Dev

如何创建一个类,使其对象之一与VB中另一个类的类型相同?

来自分类Dev

如何创建一个类,使其对象之一与VB中另一个类的类型相同?

来自分类Dev

如何在不创建子类和/或继承类的情况下从另一个类调用对象的方法?

来自分类Dev

创建一个名为 RubikRight 的 Rubik 类的子类

来自分类Dev

用子类的类型或其父类的类型创建子类对象

来自分类Dev

创建一个List实例,其类型派生自基类和接口

来自分类Dev

创建一个SKSpriteNode子类的子类

来自分类Dev

创建一个新的对象类或写一个转换的子类对象的方法?或者是其他东西?性能不偏好

来自分类Dev

实例化一个类的静态对象

来自分类Dev

为什么当我尝试从父类创建子类(向下转换)时,得到一个空对象

来自分类Dev

C ++创建一个静态类来存储指针

来自分类Dev

如何创建一个静态的整数类?

来自分类Dev

如何创建一个非静态内部Activity类?

来自分类Dev

静态字段 - 如果仅从类创建一个实例

来自分类Dev

基类静态方法返回Swift中子类的类型

来自分类Dev

测试一个对象是否是另一个实例类型的子类

来自分类Dev

当创建一个会经常在许多层面被引用的Java对象,是它更好地使用一个类的实例,或使类的静态?

来自分类Dev

创建一个子类的多个实例,只有一个超类的实例

来自分类Dev

创建包含一个类对象数组的类的实例

来自分类Dev

如何创建一个是两个类的子类的类

来自分类Dev

生命周期结束后,重新创建一个新对象,bass类的非静态数据成员的类型为引用类型,这是否定义明确?

来自分类Dev

创建一个创建自己类的对象的方法

来自分类Dev

创建一个接受类型对象的通用方法并返回一个新的类型对象

来自分类Dev

构造一个类型以更改mixin的基类

Related 相关文章

  1. 1

    如何创建一个静态类的“属性”对象?

  2. 2

    如何链接到类类型创建另一个类类型的对象

  3. 3

    快速从其基类返回一个子类

  4. 4

    难道是明智的,有一个静态方法负责创建它驻留在类的对象?

  5. 5

    如何访问在属于另一个类的静态对象中创建的列表?

  6. 6

    如何创建一个类,使其对象之一与VB中另一个类的类型相同?

  7. 7

    如何创建一个类,使其对象之一与VB中另一个类的类型相同?

  8. 8

    如何在不创建子类和/或继承类的情况下从另一个类调用对象的方法?

  9. 9

    创建一个名为 RubikRight 的 Rubik 类的子类

  10. 10

    用子类的类型或其父类的类型创建子类对象

  11. 11

    创建一个List实例,其类型派生自基类和接口

  12. 12

    创建一个SKSpriteNode子类的子类

  13. 13

    创建一个新的对象类或写一个转换的子类对象的方法?或者是其他东西?性能不偏好

  14. 14

    实例化一个类的静态对象

  15. 15

    为什么当我尝试从父类创建子类(向下转换)时,得到一个空对象

  16. 16

    C ++创建一个静态类来存储指针

  17. 17

    如何创建一个静态的整数类?

  18. 18

    如何创建一个非静态内部Activity类?

  19. 19

    静态字段 - 如果仅从类创建一个实例

  20. 20

    基类静态方法返回Swift中子类的类型

  21. 21

    测试一个对象是否是另一个实例类型的子类

  22. 22

    当创建一个会经常在许多层面被引用的Java对象,是它更好地使用一个类的实例,或使类的静态?

  23. 23

    创建一个子类的多个实例,只有一个超类的实例

  24. 24

    创建包含一个类对象数组的类的实例

  25. 25

    如何创建一个是两个类的子类的类

  26. 26

    生命周期结束后,重新创建一个新对象,bass类的非静态数据成员的类型为引用类型,这是否定义明确?

  27. 27

    创建一个创建自己类的对象的方法

  28. 28

    创建一个接受类型对象的通用方法并返回一个新的类型对象

  29. 29

    构造一个类型以更改mixin的基类

热门标签

归档