Java类继承

2 java inheritance class

在这里,它说:

这为MountainBike提供了与Bicycle相同的所有字段和方法,但允许其代码专注于使其独特的功能.这使您的子类代码易于阅读.但是,您必须注意正确记录每个超类定义的状态和行为,因为该代码不会出现在每个子类的源文件中.

但是在我的代码中,继承不能正常工作,可能是由于我的代码存在缺陷?

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();

    }

}
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Gre*_*osz 6

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

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

我建议不要使用protected速度和齿轮变量.优良作法是通过声明基类中的speedgear变量来强制执行封装private.


编辑:

显然,你是从Java编程开始的.我建议你看一下Bruce Eckel写的这本免费在线书:用Java思考.

  • 那个downvoter可以指出问题,以便我可以纠正吗? (2认同)

r3z*_*n1k 5

public class Bicycle {
   private int speed;

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


public class Mountainbike extends Bicycle {
   public Mountainbike() {
      super(10);
   }
}
Run Code Online (Sandbox Code Playgroud)