Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将子对象指定给父对象_Java_Oop_Inheritance_Polymorphism - Fatal编程技术网

Java 将子对象指定给父对象

Java 将子对象指定给父对象,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

我在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.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字段,如下所示-

自行车限速器