Java 将子对象指定给父对象
我在java代码下面运行,我不明白为什么它返回0作为输出,而不是200或500Java 将子对象指定给父对象,java,oop,inheritance,polymorphism,Java,Oop,Inheritance,Polymorphism,我在java代码下面运行,我不明白为什么它返回0作为输出,而不是200或500 class Bike{ int speedlimit; } class Honda3 extends Bike{ int speedlimit; public static void main(String args[]){ Bike obj=new Bike(); obj.speedlimit=200; Honda3 obj2=new Honda3(); obj2.spe
class Bike{
int speedlimit;
}
class Honda3 extends Bike{
int speedlimit;
public static void main(String args[]){
Bike obj=new Bike();
obj.speedlimit=200;
Honda3 obj2=new Honda3();
obj2.speedlimit=500;
obj=obj2;
System.out.println(obj.speedlimit);
}
}
输出:0
我认为obj=obj2将像运行时多态性一样工作,但我的推理似乎不正确。不知道我在这里错过了什么。
我以前没有使用过obj=obj2这样的代码,我在想是否有一个场景可以使用它?
您看到的是0,因为您使用了两个独立的speedlimit属性,一个用于Bike类,另一个用于Honda3类,您可以从Honda3类中删除该属性,因为它是从Bike类继承的 在这一行中,obj.speedlimit指定了Bike属性,而在另一方面,obj2.speedlimit指定了Honda3属性。 当您指定obj=obj2,然后从obj访问speedlimit属性时,您不再使用Honda3类中的属性,而是使用Bike类中尚未指定的属性
如果您从Honda3类中删除speedlimit属性,您的问题将消失。您将看到0,因为您使用两个单独的speedlimit属性,一个用于Bike类,另一个用于Honda3类,您可以从Honda3类中删除该属性,因为它是从Bike类继承的 在这一行中,obj.speedlimit指定了Bike属性,而在另一方面,obj2.speedlimit指定了Honda3属性。 当您指定obj=obj2,然后从obj访问speedlimit属性时,您不再使用Honda3类中的属性,而是使用Bike类中尚未指定的属性
如果您从Honda3类中删除speedlimit属性,您的问题将得到解决。当您在子类中定义一个与超类中的字段同名的字段时,您不会覆盖该字段,而只会将其隐藏给该子类的用户
因此,当您创建一个Honda3时,您创建了一个具有两个speedlimit字段的对象:Bike类的字段初始化为零,因为这是ints的默认值,而Honda3类的字段设置为200。然后,当您将Honda3用作Bike时,Bike类的speedlimit字段将不再隐藏,并打印到standard out。当您在子类中定义一个与超级类中的字段同名的字段时,您不会覆盖该字段,而只会将其隐藏给子类的用户 因此,当您创建一个Honda3时,您创建了一个具有两个speedlimit字段的对象:Bike类的字段初始化为零,因为这是ints的默认值,而Honda3类的字段设置为200。然后,当您将Honda3用作Bike时,Bike类的speedlimit字段将不再隐藏,并打印到standard out。因为obj2=obj使用隐藏字段Bike.speedlimit分配Honda3实例,该字段初始化为默认值0 将创建一个speedlimit实例变量为0的新自行车,然后将其指定为200 创建一个新的Honda3,实例变量speedlimit=0和从Bike继承的Bike.speedlimit=0,然后speedlimit被指定为500。Honda3隐藏了自行车限速 当您指定obj=obj2时,您将执行向上投影,并将本田作为自行车引用。System.out.prinlnobj.speedlimit打印自行车。speedlimit相反,如果您执行向下投影System.out.printlnHonda3 obj.speedlimit,您将获得500 此外,运行时多态性或动态分派仅适用于方法,而不适用于数据成员。方法被重写,但字段被隐藏 在obj=obj2之后 因为obj2=obj为Honda3实例分配了一个隐藏字段Bike.speedlimit,该字段被初始化为默认值0 将创建一个speedlimit实例变量为0的新自行车,然后将其指定为200 创建一个新的Honda3,实例变量speedlimit=0和从Bike继承的Bike.speedlimit=0,然后speedlimit被指定为500。Honda3隐藏了自行车限速 当您指定obj=obj2时,您将执行向上投影,并将本田作为自行车引用。System.out.prinlnobj.speedlimit打印自行车。speedlimit相反,如果您执行向下投影System.out.printlnHonda3 obj.speedlimit,您将获得500 此外,运行时多态性或动态分派仅适用于方法,而不适用于数据成员。方法被重写,但字段被隐藏 在obj=obj2之后
当您创建Honda3的对象时,所创建的对象还包括父类(即Bike)的所有字段。所有字段都使用默认值SpeedLimit=0进行初始化。同样在对象创建过程中,我们不能因为Honda3有同名字段而丢弃Bike的speedlimit字段。我们并没有告诉编译器重写该字段,所以编译器将在Honda3对象中包含两个speedlimit字段,如下所示-
speedlimitfrom Bike创建Honda3的对象时,创建的对象还包括父对象的所有字段 第二类,即自行车。所有字段都使用默认值SpeedLimit=0进行初始化。同样在对象创建过程中,我们不能因为Honda3有同名字段而丢弃Bike的speedlimit字段。我们并没有告诉编译器重写该字段,所以编译器将在Honda3对象中包含两个speedlimit字段,如下所示- 自行车限速器