在java中使用继承的类

时间:2017-07-21 00:31:15

标签: java inheritance

我是一个相当新的Java,正在开发一个使用继承的项目。现在有三个不同的类 - 顶级Car类,中级CarPart类和继承CarPart类的低级Engine类。我希望Engine类只表示组件行为/状态。我希望CarPart类是通用的 - 可以处理多个不同的部分(现在我只设置了Engine)。现在,我希望每个代表汽车零件的类(如引擎)都从一个名为“CarPart”的超类继承。 CarPart类将具有所有类型的汽车零件共享的所有状态和行为(例如条件和打印诊断报告的能力)。

以下是我希望能够创建零件对象的Car类

public class Car {
  Engine engine;

  public Car() {
    engine = new Engine();
  }

  public void run() {
    this.engine.printStatus();
  }
}

下面是我的CarPart课程,我想要对任何类型的汽车零件都是通用的,现在我只想打印零件的状态。

public class CarPart {
  private Object object; 

  public String printState(Object object) {
    System.out.println("The status is "+object.getState());
  }

}

以下是我的Engine类的代码:

public class Engine extends CarPart{
  private String state;

  public String getState() {
    if(!state.equals(null)) {
        System.out.println("The engine is "+state);
    } else {
        this.state = "off";
        System.out.println("The engine is off");
    }
    return state;
  }

  public void setState(String engineState) {
    this.state = engineState;
  }
}

我认为问题与向下转换和父类无法访问子类中的方法有关 - 但我不确定如何以正确的方式打印状态报告。任何建议将不胜感激!

3 个答案:

答案 0 :(得分:0)

getState()setState()state成员移出Engine"进入" CarPart

CarPart' s printState(Object object) {变为:

public void printState()
{ 
    System.out.println(this.state);
}

你还没有给我们足够的信息。例如,你可以给每个CarPart一个名字而不用打扰子类。像Engine这样的子类只有在你要为它们添加数据和/或功能时才有意义。例如Engine有多个气缸,也许是功率输出,可能是燃料类型。 WindscreenWiper没有任何属性。

另请注意,printState可能不是您想要的。您通常会Car浏览所有CarPartgetState()并在每个Car上调用alias server='browser-sync start --server --no-notify --directory 'desktop/project/src' --files "*.html, css/*.css, js/*.js"' ,以便alias server='browser-sync start --server --no-notify --directory desktop/project/src --files "*.html, css/*.css, js/*.js"' 可以格式化打印完成。

答案 1 :(得分:0)

注意:我自己是java的初学者,所以我可能不是100%正确。

根据我对继承的理解,对象引用类型(引用变量的类型,而不是被引用的对象的类型)确定可以在对象上实现哪些方法。例如,引用变量Object对象只能使用Object类中定义的方法(它是所有java类的超类)。但是,您无法在Object对象上调用getState()方法,因为此方法未包含在Object类中。 getState()在子类Engine中定义,因此仅可用于Engine对象。

因此,我建议您将CarPart类抽象化并在该类中实现抽象方法getState()和printState(),然后在每个子类中重写这些方法(对应于每个汽车部件)

class abstract CarPart {
    abstract String printState(Object object); 
    abstract String getState();
}

class Engine extends CarPart {
    String getState() {
        //code
    }

    String printState() {
        //code
    }
}

此外,由于您最终不仅仅拥有Engine子类,我建议您只需从该部分的各个类创建每个对象,而不是创建一个汽车类来执行此操作。可能有一种更有效的方法来使用单个类来创建不同类型的对象,但我目前还没有意识到它。

答案 2 :(得分:-1)

由于您的错误消息为" getState()未定义类型为Object",因为:

public class CarPart {
    private Object object; 
    public String printState(Object object) {
        System.out.println("The status is "+object.getState());
    }
}

在第4行中,您在Engine引用上使用了Object的方法。 Object班级没有该方法,因此无效。您可以将其转换为System.out.println("The status is "+((Engine)object).getState());(但如果对象不是Engine,则可以获得一个例外)或更改您的类。

public class Car {
    private Engine engine;
    public void run() {
        System.out.println( engine.getState() );
    }
}
public abstract class CarPart {
    public String getState();
}
public class Engine extends CarPart {
    private String state;
    public String getState(){
        if( state== null ) state= "off";
        return state;
    }
}