我正在为编程课做一个家庭作业,涉及实现接口。这里的问题是我真的只是不了解接口或它们用于什么(教授对解释它不是很好)。
分配是制作一个“车辆”超类,而不是三个子类,比如“卡车”或“吉普”,每个都有自己的几个特征。 “车辆”类必须实现类似的界面,我认为我已经想到了(我用compareTo()
方法写了比较车辆门的数量),另一个类也必须实现“混合”类(我不懂这啥意思)。然后,我们必须实施toString()
,equals(Object o)
和compareTo(Object o)
方法。
我认为compareTo()
已经失效,但是equals()
我不知道。我们要做的最后一件事是编写一个Main来测试,这涉及制作一个Vehicle对象数组,打印出来,对它们进行排序,然后重新打印它们。它还应该遍历数组并打印混合动力车的价格溢价,并使用equals(Object o)
方法来比较2辆车。
这是我的“Vehicle”超类
的代码package vehicle;
abstract public class Vehicle implements Comparable {
private String color;
private int numberOfDoors;
// Constructor
/**
* Creates a vehicle with a color and number of doors
* @param aColor The color of the vehicle
* @param aNumberOfDoors The number of doors
*/
public Vehicle(String aColor, int aNumberOfDoors) {
this.color = aColor;
this.numberOfDoors = aNumberOfDoors;
}
// Getters
/**
* Gets the color of the vehicle
* @return The color of the vehicle
*/
public String getColor() {return(this.color);}
/**
* Gets the number of doors the vehicle has
* @return The number of doors the vehicle has
*/
public int getNumberOfDoors() {return(this.numberOfDoors);}
// Setters
/**
* Sets the color of the vehicle
* @param colorSet The color of the vehicle
*/
public void setColor(String colorSet) {this.color = colorSet;}
/**
* Sets the number of doors for the vehicle
* @param numberOfDoorsSet The number of doors to be set to the vehicle
*/
public void setNumberOfDoors(int numberOfDoorsSet) {this.numberOfDoors = numberOfDoorsSet;}
@Override
public int compareTo(Object o) {
if (o instanceof Vehicle) {
Vehicle v = (Vehicle)o;
return this.numberOfDoors - v.getNumberOfDoors();
}
else {
return 0;
}
}
/**
* Returns a short string describing the vehicle
* @return a description of the vehicle
*/
@Override
public String toString() {
String answer = "The car's color is "+this.color
+". The number of doors is"+this.numberOfDoors;
return answer;
}
}
我还将发布我的一个子类
package vehicle;
abstract public class Convertible extends Vehicle {
private int topSpeed;
// Constructor
/**
* Creates a convertible with a color, number of doors, and top speed
* @param aColor The color of the convertible
* @param aNumberOfDoors The number of doors of the convertible
* @param aTopSpeed The top speed of the convertible
*/
public Convertible (String aColor, int aNumberOfDoors, int aTopSpeed) {
super(aColor, aNumberOfDoors);
this.topSpeed = aTopSpeed;
}
// Getters
/**
* Gets the top speed of the convertible
* @return The top speed of the convertible
*/
public int getTopSpeed() {return(this.topSpeed);}
// Setters
/**
* Sets the top speed of the convertible
* @param topSpeedSet The top speed to set to the convertible
*/
public void setTopSpeed(int topSpeedSet) {this.topSpeed = topSpeedSet;}
/**
* Returns a short description of the convertible
* @return a short description of the convertible
*/
@Override
public String toString() {
String answer = "The car's color is "+super.getColor()
+", the number of doors is "+super.getNumberOfDoors()
+", and the top speed is "+this.topSpeed+" mph.";
return answer;
}
}
我绝对不会要求任何人为我做这项工作,但如果有人能够更多地了解界面如何工作以及这项功课真正要求的那么好。
非常感谢所有帮助
谢谢!
答案 0 :(得分:12)
不是做你的特定例子,我将讨论为什么接口有用以及如何在更一般的情况下使用它们。
什么是界面?
当我第一次开始编程时,我也发现界面的概念令人困惑,因此我喜欢将其视为标准的“规则手册”。实现此规则手册的每个类都有一个必须遵循的“规则”列表。例如,请考虑以下界面:
interface Bounceable{
public void setBounce(int bounce);
public int getBounce();
}
上面的规则书声明了一个可以反弹的界面。它指出任何可以反弹的东西都必须设置它的反弹并且也会反弹。任何实现此接口的类都必须遵循规则手册。
为什么这本规则书会有用?
那么,如果你想编写一个游乐场,孩子们玩各种有弹性的东西,那该怎么办?你可以制作以下类型的弹性东西..
public class FootBall implements Bounceable{
private int bounce;
public void setBounce(int bounce){
this.bounce = bounce;
}
public int getBounce(){
return this.bounce;
}
}
public class BaseBall implements Bounceable{
private int bounce;
public void setBounce(int bounce){
this.bounce = bounce;
}
public int getBounce(){
return this.bounce;
}
}
上述类定义了一种弹力球。然后,您将创建您的playground类,并可以围绕抽象Bounceable接口定义方法。例如,如果篮球圈是你班上的一种方法怎么办?如果它可以接受任何有弹性的东西作为一个论点怎么办?这意味着只要它实现了可弹性,你就可以传递任何类型的球。如果你没有接口或类似的功能,你可以看到你的代码有多乱,你实现的球越多。
编辑:我已经包含了一个小实用示例..
这方面的一个实际例子是..
public void slamDunk(Bounceable bouncyThing){
System.out.println("You scored three points!");
}
以下两个对slamDunk的调用都是有效的......
slamDunk(new BaseBall());
slamDunk(new FootBall());
现在,您的slameDunk
功能可以使用任何可跳转的对象获得积分。
答案 1 :(得分:0)
the docs中描述了Comparable接口 http://docs.oracle.com/javase/6/docs/api/java/lang/Comparable.html 并签名:
int compareTo(T o)
Compares this object with the specified object for order.
Returns a negative integer, zero, or a positive integer as this object is less than,
equal to, or greater than the specified object.
如果你写:
public class Vehicle implements Comparable {
//...
}
然后尝试编译它,你会收到一个错误。界面要求您必须拥有方法compareTo()
。你必须写它,它必须返回一个整数值。根据车辆是否“大于”,“小于”或等于另一车辆,这将是正的,负的或零。你决定“大于”意味着什么 - 它可能是质量,年龄,价值或任何东西。这就是接口的价值 - 它说明了你必须做的事情,而不是你必须做的事情。
由于您希望自己这样做,我建议您按照Comparable上的任何教程进行操作。
答案 2 :(得分:0)
正如其他人所说,界面就像是一个班级的合同。当一个类实现一个接口时,它声称以某种方式运行(例如当你的类实现Comparable
时,它声称与其他对象相当,并且它通过实现compareTo
方法来满足此契约。)
听起来你的麻烦不在于接口 - 你已经实现了Comparable
。您应该检查null
中的compareTo
。
您询问equals(Object o)
。这比compareTo(Object o)
更容易 - 当您要比较的对象与此对象相同时,它需要返回true
,而当它不是时,它需要返回false
。 (请注意,请务必核对null
- 如果o
为null
,则应返回false。
此外,您询问的是toString()
,但您已在代码中实施了toString()
。唯一的评论是特定的子类'toString()
应该提到一些特殊的东西(例如,它是敞篷车或混合动力车等......)
答案 3 :(得分:0)
(在下面的场景中,将每个名词视为一个类(某些时间属性) 在程序和每个动词作为类的方法)
你正在建造一个机器人。你做过机器人的事情 1. 2个眼睛传感器,2只手,2条腿和一个头部(机器人的高度= 2米) 2.为了与这个机器人进行通信,你从头部取出了10根电线,从腿上取出了10根电线,从手中取出了13根电线。
逻辑是如果头线1连接腿线2,那么机器人将走路。如果手中的9号线连接4号线头,1号线连接线6,则双手将上升......等等。 IMP注意 - 头上的电线3不应接触腿上的电线5。否则每件事都会打击。
这是什么界面啊!
现在想象一下,有人会第一次看到机器人。现在想想如何使用这个机器人。
在创建课程的类似注释中,您应该注意其他程序将如何使用它。你想让公共字段(int和string)可用于其他程序,或者你想要简单的函数来处理所有那些复杂的整数逻辑。
接口提供了在两个类之间进行通信的简便方法,并且在这样做时,他们不必担心我班级的其他事情会发生什么。