首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java类继承

Java类继承
EN

Stack Overflow用户
提问于 2009-12-18 10:46:39
回答 8查看 1.1K关注 0票数 2

这里,它说:

这为MountainBike提供了与自行车相同的字段和方法,但允许它的代码只关注使其惟一的特性。这使得子类的代码易于阅读。但是,您必须注意正确地记录每个超类定义的状态和行为,因为该代码不会出现在每个子类的源文件中。

但是,在我的代码中,继承不能正常工作,可能是因为我的代码中有一个缺陷?

代码语言:javascript
复制
package java1;

class bicycle {
    int speed = 0;
    int gear = 1;

    void accelerate(int incr) {
        speed = speed + incr;
    }

    void decelerate(int incr) {
        speed = speed - incr;
    }

    void changeGear(int val) {
        gear = val;
    }

    void printInfo() {
        System.out.println("Speed: " + speed + " Gear: " + gear);
    }
}

class mountainbike extends bicycle {
    int speed = 10;
}

public class Main {

    public static void main(String[] args) {

        mountainbike mb1 = new mountainbike();

        mb1.accelerate(20);
        mb1.accelerate(10);

        mb1.printInfo();

    }

}

山地车课应该继承自行车课的所有特点,对吧?我添加了一个唯一的属性,即int speed = 10,因此启动速度应该是10。但是在运行编译器时,将启动速度视为0。

有什么想法吗?

EN

回答 8

Stack Overflow用户

发布于 2009-12-18 10:48:21

不,您的Mountainbike类不应该重新定义speed变量。您需要将初始速度(10)传递给其超类的构造函数,使用super作为构造函数调用的一部分:

代码语言:javascript
复制
package java1;

class Bicycle
{

  Bicycle(int speed, int gear)
  {
    this.speed = speed;
    this.gear = gear;
  }

  public void accelerate(int incr)
  {
    speed = speed + incr;
  }

  public void decelerate(int incr)
  {
    speed = speed - incr;
  }

  void changeGear(int val)
  {
    gear = val;
  }

  public String toString()
  {
    return "Speed: " + speed + " Gear: " + gear;
  }

  private int speed = 0;
  private int gear = 1;

}

class Mountainbike extends Bicycle
{
  public Mountainbike()
  {
    super(10, 1);
  }
}

public class Main {

  public static void main(String[] args)
  {    
    Mountainbike mb1 = new Mountainbike();

    mb1.accelerate(20);
    mb1.accelerate(10);

    System.out.println(mb1);
  }
}

我建议不要对速度和齿轮使用protected变量。通过在基类中声明speedgear变量private来强制封装是很好的做法。

编辑:

显然,您是从Java编程开始的。我建议你看看这个免费的在线书,由布鲁斯埃克尔:Java中的思考

票数 6
EN

Stack Overflow用户

发布于 2009-12-18 10:51:17

代码语言:javascript
复制
public class Bicycle {
   private int speed;

   public Bicycle (int speed) {
      this.speed = speed;
   }
}


public class Mountainbike extends Bicycle {
   public Mountainbike() {
      super(10);
   }
}
票数 5
EN

Stack Overflow用户

发布于 2009-12-18 10:53:03

不能覆盖字段,只能重写方法。您需要做的是将speed字段标记为protected,将构造函数添加到子类中,并在该构造函数中设置字段的值,如下所示:

代码语言:javascript
复制
class Mountainbike extends Bicycle {
    public Mountainbike()
    {
        speed = 10;
    }
}

顺便说一下,请注意,我已经更正了您的类名: Java对于大写类名具有压倒性的强约定;使用小写类名只会使查看代码的人感到困惑。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1927480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档