gpt4 book ai didi

java - 关于动态绑定(bind)的困惑

转载 作者:行者123 更新时间:2023-12-02 05:14:31 26 4
gpt4 key购买 nike

正如我从教科书上学到的,如果我将一个父类(super class)类型的变量名(即 newObject)分配给子类类型的对象,并且子类有一些重写的​​方法,即方法 toString(),那么当我调用newObject.toString()时,将调用重写的方法,而不是原始方法。

但在另一种情况下,我并没有再次发生这种情况。例如,我的父类(super class)名为 Ship,其子类为 CruiseShip

class Ship{}

class CruiseShip extends Ship implements Serializable {
int getSize() {
return 42;// value is not important now
}
}

我序列化 CruiseShip 的实例,然后对其进行反序列化。

CruiseShip cs = new CruiseShip();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(cs);
oos.close();

ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(
baos.toByteArray()));
Object obj = ois.readObject();
ois.close();

现在返回对象的类型为Object,因此我将类型转换为Ship类型,以便我可以将其分配给变量名称newShip,其类型为 Ship

Ship newShip = (Ship)obj;

问题是我无法调用类 CuiseShip 的某些方法,说 getSize(),

int size = newShip.getSize();//error: method getSize() is undefined for the type Ship

它没有在父类(super class)Ship中定义。只有当我将对象强制转换为 CruiseShip 时,我才能调用该方法。

int size = ((CruiseShip)newShip).getSize();//OK

那么,这里发生了什么?我预计动态绑定(bind)将允许我使用 newShip 调用方法 getSize(),但事实并非如此。

最佳答案

这并不完全是动态绑定(bind)的工作原理。如果该方法存在于父类(super class)中并且在子类中被重写,那么即使在声明类型父类(super class)的对象上调用,如果它实际上是子类类型的方法将被调用。子类的方法。但是,如果该方法未在父类(super class)中定义,则无法从声明为该类型的对象调用该方法。否则就没有意义 - 如果对象不是子类类型而只是父类(super class)类型怎么办 - 这将是一个类型错误。

如果您无法在父类(super class)中实现该方法,那么您要么没有做一个适合动态绑定(bind)的示例,要么您的父类(super class)实际上应该是一个接口(interface)或抽象。

例如:

class Animal
{
void Eat(){
System.out.println("Yum!");
}
}

class Dog extends Animal
{
void Eat(){
System.out.println("Arf!");
}
}

现在,如果你写

Animal rex = new Dog();
rex.Eat();

输出将为“Arf!”

但是,如果将 class Dog 更改为

class Dog extends Animal
{
void Eat(){
System.out.println("Arf!");
}

void Bark(){
System.out.println("Woof!");
}
}

并写

Animal rex = new Dog();
rex.Bark();

您将收到一条错误消息 - 动物不能吠叫。事实上,如果霸王龙是一条鱼,那真的就没有意义了。

关于java - 关于动态绑定(bind)的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27081308/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com