它的输出会如何?我怀疑在两种情况下都创建了哪个类。我是java的新手,所以请简要解释一下对象实例化过程。 在这个程序中,我希望输出为150,但是ans in = s 90。 方法和数据变量如何访问差异?
计划1:
class Bike
{
int speedlimit=90;
}
class Honda3 extends Bike
{
int speedlimit=150;
public static void main(String args[])
{
Bike obj=new Honda3();
System.out.println(obj.speedlimit);//90
}
}
计划2:
class Bike
{
int speedlimit=90;
void display()
{
System.out.println(speedlimit);
}
}
class Honda3 extends Bike
{
int speedlimit=150;
void display()
{
System.out.println(speedlimit);
}
public static void main(String args[])
{
Bike obj=new Honda3();
obj.display();
}
}
解释这两个代码之间的差异。
在程序1中,为Honda3
创建了对象,并将其分配给类型为Bike
的obj。我不明白超级方法是如何执行的?
答案 0 :(得分:1)
当子类声明具有相同签名(方法名称+参数类型)的方法作为基类中的方法时,基类方法重写。
这意味着总是为子类的对象调用子类方法,即使用于调用的变量被声明为基类。
当子类声明一个与基类中的字段同名的字段时,基类字段为隐藏,但它们仍然存在并且可以具有不同的值。
基类中的代码将访问基类中的字段。
子类中的代码将访问子类中的字段。基类中的字段已被隐藏,但可以通过super.
符合条件来访问。
类外部的代码将访问编译器可见的字段,即用于访问字段的变量类的字段。
因此,当使用Bike obj = new Honda3()
时,您会得到:
obj.display()
会调用Honda3.display()
方法。obj.speedlimit
将访问Bike.speedlimit
字段。由于这些原因,字段隐藏是大NO,NO!
不要这样做。代码变得模糊不清,可能不像您认为的那样。
如果你这样做,任何好的IDE都会发出警告。
覆盖基类方法的方法应始终使用@Override
进行注释。编译器将验证该方法实际上是否覆盖了基类方法,确保您没有弄乱方法签名。
如果您没有注释,任何好的IDE都会警告您,以确保您在没有意图时不会意外覆盖基类方法。
答案 1 :(得分:0)
我不明白超级方法是如何执行的?
你不能调用超类的重写方法的实现。这是设计的。如果它们有不同的用途,你不应该给两个方法使用相同的名称,并且一个方法覆盖另一个方法。
class Bike {
int speedlimit=90;
void display() {
System.out.println(speedlimit);
}
}
class Honda3 extends Bike {
int overdriveSpeedlimit=150;
void displayOverdrive() {
System.out.println(overdriveSpeedlimit);
}
}
public static void main(String[] args) {
Honda3 honda= new Honda3();
honda.displayOverdrive();
Bike obj = honda;
obj.display();
}