对象可以具有未在类中定义的方法或变量吗?

时间:2019-06-23 14:48:52

标签: java class oop object instance

我知道问这个问题很愚蠢,但是我想确定一下。在面向对象的语言中,从特定类创建的对象是否有可能存在该类中未定义的方法或变量的情况或机会? / p>

1 个答案:

答案 0 :(得分:0)

在类中可能没有直接定义的变量和方法。当您有一个抽象类和一个子类(扩展该抽象类的类)时,就会发生这种情况。

对于OOP来说,这实际上是一种非常常见的方法,可以使您的代码库具有更好的可重用性。

想象一下,您有一个名为 Vehicle 的抽象类,它看起来像这样:

public abstract class Vehicle {

protected enum Condition {
    BAD,
    OK,
    GOOD
}

private int numOfWheels;
private int numOfSeats;
private boolean isDriving;
private boolean isMotorized;
private Condition condition;

public Vehicle(int numOfWheels,
               int numOfSeats,
               boolean isDriving,
               boolean isMotorized,
               Condition condition) {
    this.numOfWheels = numOfWheels;
    this.numOfSeats = numOfSeats;
    this.isDriving = isDriving;
    this.isMotorized = isMotorized;
    this.condition = condition;
}

protected void repair() {
    if(!this.condition.equals(Condition.GOOD)) {
        this.condition = Condition.GOOD;
    }
}

然后您有一个名为 Car 的子类,该子类可能类似于:

public class Car extends Vehicle {
private String brand;
private String model;

public Car(int numOfSeats,
           boolean isDriving,
           Condition condition,
           String brand,
           String model) {
    super(4, numOfSeats, isDriving, true, condition);
    this.brand = brand;
    this.model = model;
}

您的Car类中的构造函数首先使用给定的参数调用父类中的超级构造函数,然后为您的Car对象设置特定的变量。

然后您可以使用以下方式调用您的Car construcor:

Car car = new Car(2, false, Vehicle.Condition.BAD, "Mercedes", "AMG");

因此,如果您要立即调用在抽象类Vehicle中定义的修复方法,则只需执行以下调用:

car.repair();

我们通过此体系结构实现的是,每当我们要创建一个像“自行车”这样的“车辆”对象时,我们只需要声明一些特定的变量或方法,就像我们在Car类中所做的一样,就不一样了一遍又一遍。

在更大的项目中,这可以节省许多工作,并使您的生活更轻松。

希望我的解释可以帮助您理解OOP的原理。