我是一个相当新的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;
}
}
我认为问题与向下转换和父类无法访问子类中的方法有关 - 但我不确定如何以正确的方式打印状态报告。任何建议将不胜感激!
答案 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
浏览所有CarPart
个getState()
并在每个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;
}
}