使用抽象类创建对象

时间:2013-11-18 09:25:41

标签: java inheritance interface abstract

我想了解更好的oop,但我不明白如何使用抽象类。 我有一个汽车类,汽车可以是梅赛德斯,奥迪和沃尔沃。梅赛德斯汽车可以有5名乘客,可以打开车门和挡车窗;奥迪车可以有6名乘客,只需开门即可。沃尔沃汽车只能有3名乘客。 所以,为了做到这一点,我创建了一个界面:

public interface Car{
void openDoor();
void blockWindows();
int passengers=0;
}

然后我为每辆车创建了一个抽象类:

public abstract class  Mercedes implements Car{
public void openDoor(){
    System.out.println("Mercedes opendoor");
}
  public void blockWindow(){
    System.out.println("Mercedes blockwindow");
}
public Mercedes()
{
int passengers=5;
}



 public abstract class  Audi implements Car{
public void openDoor(){
    System.out.println("Audi opendoor");
}
public Audi()
{
int passengers=6;
}
  }

public abstract class  Volvo implements Car{

public Volvo()
{
int passengers=6;
}

现在,我需要创建一个可以运送最多15辆汽车的物体。所以我写道:

public class TransportCars{
Car[] transport=new Car[15];}

//现在我需要放入运输数组不同类型的汽车。但我无法实例化抽象类。我应该用别的吗?我使用抽象类,因为我可以实现一个接口并只使用它的一部分

5 个答案:

答案 0 :(得分:3)

基本上你的设计是完全错误的,因为你是java的新手,你首先需要了解基本的。

设计应该是这样的:

汽车是一种车辆,所以is-a关系。

所以你可以创建一个类车辆。

class Vehicle {
   // properties of Vehicle like type of Vehicle, numberOfWheels etc.
   String vType;
   int numberOfWheels;
   int passengers;
}

// Car is a Vehicle so it should extend Vehicle
class Car extends Vehicle {
    String type; // sedan or hatchback
    String manufacturer; // Mercedes, BMW, Audi, Volvo etc.
}

如果您想限制车辆不被实例化,您可以将其声明为abstract class

答案 1 :(得分:3)

接口和抽象类有一些相似之处,但不一样。对于您的示例,您可能应该将Car作为摘要,并将Mercedes,Audi和Volvo extend作为抽象类。然后确保在每个扩展它的类中的Car中实现任何抽象方法。这样做会使他们成为具体的类,可以实例化。

使用接口无法使用的抽象类可以做的一件事就是包含数据。我看到你已经使用你的接口为乘客提供了这个,但在界面中,值将是 static final

答案 2 :(得分:2)

就类之间的关系而言,抽象类和接口之间没有太多区别:您无法实例化它们中的任何一个,它们将被用作依赖于它们的对象的模板。但是,您可以部分实现抽象类的方法,但即使实现了所有这些方法,您也无法实例化定义为抽象的类。简明扼要:

接口:

  • 定义方法。
  • 一个类可以实现多个接口。
  • 公开可见性(默认情况下为包)。
  • 无法实例化。

抽象类:

  • 定义方法并实施它们。
  • 一个类只能从一个类继承(抽象或不抽象)。
  • 用户定义的可见性。
  • 无法实例化。

如果您的汽车要实现多个接口,请使用接口,但它们的范围必须是公共的或封装的。如果您只想与一个类建立继承关系,请使用abstract。

答案 3 :(得分:2)

你似乎错误地采取了这种做法。寻求教程会更好,但我会尽量为你清理:

汽车类应该是接口或抽象类(或两者都不是)。 如果它是一个界面,比梅赛德斯,奥迪和沃尔沃应该实现它。 如果是这种情况,“car”中的任何方法都必须在其他方法中实现,因此所有方法都必须具有“打开门”和“阻止窗口”。你必须为每个实现类选择如何实现它。

如果它是一个抽象类,你可以在“car”中实现一些方法,它们将在梅赛德斯,奥迪和沃尔沃(将“扩展”汽车)中“按原样”工作,除非你重新定义它们在他们各自的班级。如果你想在每个继承类中强制执行它们的实现,你可以在“car”中定义那些抽象的方法,而不是在汽车中实现它们。

如果你想在汽车中实现所有方法,你根本不需要它是抽象的。你仍然可以像上面提到的那样重新定义它们。

答案 4 :(得分:2)

我看到问题为什么你很难理解抽象,这是因为你的例子是错误的。汽车类型必须是具体类,从抽象类继承抽象类的特殊性在于,您无法创建其中一个,只能继承它,这有利于多态。但真正的好处来自抽象方法。

创建Car接口,而不是创建Vehicle接口。 由于您不知道每种类型的汽车可以携带多少乘客Car abstract 类。每辆车都必须启动和停止。而且你知道汽车必须先装载乘客才能开始。最后,无论车型是什么类型,或者是什么类型的车辆,您都可以启动所有车辆。

interface Vehicle {
    public start();
    public stop();
}

abstract class Car implements Vehicle {
    protected wheels = 4;

    public start() {
        loadPassengers();
        // do extra stuff like 
        //closeDoors();
    }

    abstract public loadPassengers();
}

public class Volvo extends Car {
    int passengers  =  6;

    public loadPassengers() {
         doSomething(this.passengers);
    }
}

public static void main() {
    List<Car> cars = new ArrayList<Car>();
    cars.add(new Volvo());
    cars.add(new Mercedes());

    for(Car car : cars) {
        car.start();
    }
}