继承如何在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`
# 1 楼答案
在对象上调用的方法不是由变量的类型决定的,而是由对象的类型决定的,如果对象的类型是实例化的,那么对象的类型将是
Honda3
。无法从Honda3
实例获得输出Bike is running
# 2 楼答案
让我给你解释一下
A.
Bike obj=new Honda3();
在这里,您正在创建Honda3
类而不是Bike
类的对象。所以obj
的引用类型是Bike
,对象类型是Honda3
B.您得到的结果低于输出,因为当您调用
new Honda3()
时Honda3
的构造函数将被调用。默认construcor中的第一个语句总是super()
(它是Bike
的construcor)。即使你不放,它也会放在我的编译器里C.对字段的访问始终由静态类型决定。这与由实际对象的运行时类型确定的方法不同。换句话说,对于字段访问,编译器在编译时确定要访问的内容。因此,这些值来自
Bike
D.对于
您已经覆盖了Honda3中的
run
方法。因此,这是一个运行时多态性。因为对象类型是Honda3
,所以您会看到希望这有帮助
# 3 楼答案
第一个问题,关于将对象强制转换为父对象:
https://stackoverflow.com/a/16224294/6103979
第二个问题,关于运行super run():
https://stackoverflow.com/a/1032906/6103979
# 4 楼答案
为什么??您的对象类型是本田,而不是自行车
这是上档
但是,我认为您不是在使用这种语法,而是在从Honda类调用
super.run()
可能的更多信息:Why do we assign a parent reference to the child object in Java?