Java的继承
继承
通过继承,将现有类的字段和方法传递给另一个类。
新创建的继承类可以添加自己的字段和方法进行定制。
被继承的类称为“父类”,通过继承生成的新类称为“子类”。
在使用继承定义新的子类时,使用关键词“extends”进行类定义。
class サブクラス名 extends スーパークラス名 {
}
使用extends关键字可以继承父类,并指定父类名称。
我们假设Bicycle.java和Car.java的内容是重复的。
class Main {
public static void main(String[] args) {
〜省略〜
}
}
class Bicycle extends Vehicle {
}
class Car extends Vehicle{
}
class Vehicle {
〜省略〜 //Bicycle.javaとCar.javaの重複している部分
}
调用超类的方法
子类继承了父类的字段和方法。
可以对子类的实例调用父类的实例方法。
【例】继续上面的例子。
class Main {
public static void main(String[] args) {
Car car = new Car();
car.setName("フェラーリ"); //carの名前を指定してます
car.setColor("赤"); //carの色を指定してます
Bicycle bicycle = new Bicycle();
bicycle.setName("ビアンキ"); //bicycleの名前を指定してます
bicycle.setColor("緑"); //bicycleの色を指定してます
System.out.println("【車の情報】");
car.printData();
System.out.println("=================");
System.out.println("【自転車の情報】");
bicycle.printData();
}
}
子类的字段和方法
子类的实例可以调用自己类中定义的方法和父类中的方法。
而父类的实例不能调用子类的方法。
对于子类的实例,如果调用的方法在子类中有定义,则从子类调用;如果没有定义,则从父类调用。
【例】接下来延续上述例子。
class Main {
public static void main(String[] args) {
Car car = new Car();
〜省略〜
int litre = scanner.nextInt();
car.charge(litre);
〜省略〜
bicycle.printData();
}
}
class Car extends Vehicle{
public void charge(int litre) {
System.out.println(litre + "L給油します");
if (litre <= 0) {
System.out.println("給油できません");
} else if (litre + this.fuel >= 100) {
System.out.println("満タンまで給油します");
this.fuel = 100;
} else {
this.fuel += litre;
}
System.out.println("ガソリン量:" + this.fuel + "L");
}
}
覆盖
通过在子类中定义一个与从超类继承的方法同名的方法,可以覆盖超类方法的内容,这称为”覆写”。
当调用子类实例的方法时,首先在子类内部查找该方法,如果存在,则调用该方法。
也就是说,如果子类有与超类同名的方法,那么该方法会被执行,结果就是方法的内容被覆盖。
【例】继续上述例子
class Car extends Vehicle{
public void charge(int litre) {
public void printData() {
System.out.println("名前:" + this.getName());
System.out.println("色:" + this.getColor());
System.out.println("走行距離:" + this.getDistance() + "km");
System.out.println("ガソリン量:" + this.getFuel() + "L");
}
〜省略〜
}
省略了但覆盖了Vehicle.java的内容。
将重复的内容删除。
删除方法是使用”super.方法名()”。
使用”super.方法名()”可以从子类的实例方法中调用超类的实例方法。
【例】继续上述内容。
class Car extends Vehicle{
public void charge(int litre) {
public void printData() {
super.printData(); //重複している部分を消しています
System.out.println("ガソリン量:" + this.getFuel() + "L"); //こちらは重複していないとします
}
〜省略〜
}
下一步,在子类中定义构造函数。
要调用超类的构造函数,请使用“super()”。
【例】继续上面的例子,使用“super()”来调用name和color。
class Bicycle extends Vehicle
Bicycle(String name, String color) { //Bicycleクラスのコンストラクタを定義しています
super(name, color); //superを用いてスーパークラスのコンストラクタを呼び出してます
}
}
class Car extends Vehicle{
Car(String name, String color) {
super(name, color);
}
〜省略〜
}
class Vehicle {
private String name;
private String color;
private int distance = 0;
Vehicle(String name, String color) { // Vehicleクラスのコンストラクタを定義しています
this.name = name;
this.color = color;
}
〜省略〜
}