我是Java的新手,对于Upcasting和Down-Casting产生了疑问。 我写了以下代码:
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
当我创建Object obj时,它被上传到Parent Class Bike,它显示或描述在父类中声明的变量,而不是它本身。 但是它不会在父类中执行run方法,即自行车,但它仍然执行Honda3类中的运行方法。
所以我的疑问是,每当任何对象向其父类转发时,它是否会丢失其所有属性或变量?
为什么Upcast对象无法访问父方法,即使用以下内容?
`Bike obj = new Honda3(); // Output should be : Bike is Running`
答案 0 :(得分:0)
输出应该是:自行车正在运行
为什么呢?你的对象类型是本田,而不是自行车。
这是投票。
((Bike) obj).run()
尽管如此,我认为你要从本田班级致电super.run()
而不是那种语法
可能更多信息:Why do we assign a parent reference to the child object in Java?
答案 1 :(得分:0)
调用对象的方法不是由变量的类型决定的,而是由对象的类型决定的,如果你是实例化的话,它将是Honda3
。您无法从Bike is running
实例获得输出Honda3
。
答案 2 :(得分:0)
答案 3 :(得分:0)
让我解释一下。
一个。 Bike obj=new Honda3();
在这里,您正在创建Honda3
类而非Bike
类的对象。因此obj
的引用类型为Bike
,对象类型为Honda3
B中。您的输出低于输出值,因为当您调用new Honda3()
时,将调用Honda3
的构造函数。默认construcor中的第一个语句始终是super()
(它是Bike
的构造者)。即使你没有把它,它也会被我的编译器。
inside Bike
inside Honda
℃。对字段的访问始终由静态类型确定。这与由实际对象的运行时类型确定的方法形成对比。换句话说,对于字段访问,编译器在编译时确定将要访问的内容。因此,这些值来自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
希望这有帮助!