你能解释下面代码之间的区别吗?

时间:2016-04-01 07:46:06

标签: java

它的输出会如何?我怀疑在两种情况下都创建了哪个类。我是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。我不明白超级方法是如何执行的?

2 个答案:

答案 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();
}