有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

继承如何在JAVA中使用向上转换对象访问父方法?

我是Java新手,对上下转换有疑问。 我编写了以下代码:

class Bike{
 int speedlimit=90;
 int bikeId = 123576;
  Bike(){  
  System.out.println("inside Bike");} //end constructor

 public void run(){ System.out.println("Bike is running");
   }// end run 

 };//end Bike 


class Honda3 extends Bike{
 int speedlimit=150;
 int bikeId = 456;

 Honda3(){    System.out.println("inside Honda");} //end constructor

 public void run(){ System.out.println("Honda is running");
 }// end run 

  public static void main(String args[]){
   Bike obj=new Honda3();
   System.out.println(obj.speedlimit);
   System.out.println(obj.bikeId);
   obj.run();
   Honda3 obj2 = (Honda3) obj;
   obj2.run();
   obj.run();
   }  // end main
 };//end honda3

输出:

inside Bike
inside Honda 
90
123576
Honda is running
Honda is running
Honda is running

当我创建对象obj时,它被上溯到父类Bike,它显示或描述在父类内部声明的变量,而不是在其本身。 但它不会在父类(即Bike)内执行run方法,但仍会执行Honda3类中的run方法

所以我的疑问是,每当任何对象向上转换到其父类时,它是否会丢失其所有属性或变量

还有,为什么一个向上转换对象不能访问父方法,即使用以下方法

`Bike obj = new Honda3(); // Output should be : Bike is Running` 

共 (4) 个答案

  1. # 1 楼答案

    在对象上调用的方法不是由变量的类型决定的,而是由对象的类型决定的,如果对象的类型是实例化的,那么对象的类型将是Honda3。无法从Honda3实例获得输出Bike is running

  2. # 2 楼答案

    让我给你解释一下

    A.Bike obj=new Honda3(); 在这里,您正在创建Honda3类而不是Bike类的对象。所以obj的引用类型是Bike,对象类型是Honda3

    B.您得到的结果低于输出,因为当您调用new Honda3()Honda3的构造函数将被调用。默认construcor中的第一个语句总是super()(它是Bike的construcor)。即使你不放,它也会放在我的编译器里

    inside Bike
    inside Honda
    

    C.对字段的访问始终由静态类型决定。这与由实际对象的运行时类型确定的方法不同。换句话说,对于字段访问,编译器在编译时确定要访问的内容。因此,这些值来自Bike

    90
    123576
    

    D.对于

    obj.run();
    Honda3 obj2 = (Honda3) obj;
    obj2.run();
    obj.run();
    

    您已经覆盖了Honda3中的run方法。因此,这是一个运行时多态性。因为对象类型是Honda3,所以您会看到

    Honda is running
    Honda is running
    Honda is running
    

    希望这有帮助

  3. # 4 楼答案

    Output should be : Bike is Running

    为什么??您的对象类型是本田,而不是自行车

    这是上档

    ((Bike) obj).run()
    

    但是,我认为您不是在使用这种语法,而是在从Honda类调用super.run()

    可能的更多信息:Why do we assign a parent reference to the child object in Java?