Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现可克隆接口_Java_Interface_Cloneable - Fatal编程技术网

Java 实现可克隆接口

Java 实现可克隆接口,java,interface,cloneable,Java,Interface,Cloneable,请注意: 我早些时候写了一篇文章,上面有这个问题和其他几个问题,但有人告诉我,既然我在同一篇文章中问了这么多问题,最好把它分成几个单独的问题。因此,请不要将此标记为重复,是的,说明相同,使用的代码相同,但问题本身不同。谢谢 我正在按照以下说明编写一个程序: 编写一个名为Octagon的类,该类扩展GeometricObject并实现可比较和可克隆的接口。假设八角形的所有8条边大小相等。可使用以下公式计算面积 area = (2 + 4/square root of 2) * side * sid

请注意: 我早些时候写了一篇文章,上面有这个问题和其他几个问题,但有人告诉我,既然我在同一篇文章中问了这么多问题,最好把它分成几个单独的问题。因此,请不要将此标记为重复,是的,说明相同,使用的代码相同,但问题本身不同。谢谢

我正在按照以下说明编写一个程序:

编写一个名为Octagon的类,该类扩展GeometricObject并实现可比较和可克隆的接口。假设八角形的所有8条边大小相等。可使用以下公式计算面积

area = (2 + 4/square root of 2) * side * side 
编写一个程序(驱动程序),从文件中读入一系列值,显示面积和周长,创建克隆并比较对象及其克隆(基于面积)。此外,您的程序应该将当前对象(刚刚读入)与第一个读入的对象进行比较。当从文件中读取负数时,程序结束

这是我到目前为止的代码,这是我的GeometricObject类:

public abstract class GeometricObject {

    public abstract double getArea();
    public abstract double getPerimeter(); 
}
我的八角形类:

public class Octagon extends GeometricObject implements Comparable<Octagon>, Cloneable {

    private double side;

    public Octagon() {
    }

    public Octagon(double side) {
        this.side = side;
    }

    public double getSide() {
        return side;
    }

    public void setSide(double side) {
        this.side = side;
    }

    public double getArea() {
        return (2 + (4 / (Math.sqrt(2))) * side * side); 
    }

    public double getPerimeter() {
        return side * 8;
    }

    public String toString() {
        return "Area: " + getArea() + "\nPerimeter: " 
            + getPerimeter() + "\nClone Compare: " +  "\nFirst Compare: ";
    }

    public int compareTo(Octagon octagon) {
        if(getArea() > octagon.getArea()) 
            return 1;
        else if(getArea() < octagon.getArea()) 
                return -1;
        else
            return 0;
    }

    @Override 
    public Octagon clone() {
        return new Octagon(this.side);
    } 
}
我很难弄清楚如何实现可克隆接口,这样当我打印结果时,他们会说克隆比较:相等(或不相等)


非常感谢您的任何意见

我要做的是首先实现方法
Octagon.clone()
,方法是创建一个具有相同边长的八角形

Public Octagon clone(){
    return new Octagon(this.side);
}
驱动程序中让它克隆新创建的八角形,并将两者(旧的和新的)进行如下比较:

String cloneComparison = "Clone Comparision: ";
if ( older.getArea() == newer.getArea() ){
    cloneComparison = cloneComparison + "Equal";
} else {
    cloneComparison = cloneComparison + "Not Equal";
}
System.println(cloneComparison);

根据结果返回正确的字符串。

为什么要比较区域?只是比较一下两边。面积是用sqrt(2)计算的双精度,考虑到浮点误差,你不能只比较它…因为方向就是这么说的。你真的是这个意思吗?可能您需要
Comparable
?是的,我也在使用Comparable,但还需要使用Cloneable(我们应该为读入的每个对象制作一个克隆,并将其与该对象的原始对象进行比较)。如果您不调用
对象,是否实现
Cloneable
,没有任何区别。clone()
。在Octagon.clone()部分,这是除了我已有的“@Override Octagon clone(){…”之外的另一个方法,还是简单地将现有方法中的代码更改为this.getSide(),而不是现在编写的this.side?@Beth您已经做的很好:
this.side
vs
this.getSide()
实际上并不重要。我不清楚你的实际问题是什么。哦,好吧,我只是想确定一下,就像我说的,我以前从未使用过这个,所以我还在学习如何处理一切。@Bethtaner,如果你已经有了一个
八角形的克隆()
method您应该可以看看它是否有效。这个.side实际上是检索字段的更好方法-我将更改我的答案,以反映较旧和较新的只是代表较旧(原始)和较新(克隆)八角形的变量。较旧的八角形将是您的oct变量,较新的八角形将是您的oct变量(我们在这里称之为克隆)需要通过克隆来创建:
Octagon clone=oct.clone();
一旦两者都有了,就应该能够对它们进行比较。
Public Octagon clone(){
    return new Octagon(this.side);
}
String cloneComparison = "Clone Comparision: ";
if ( older.getArea() == newer.getArea() ){
    cloneComparison = cloneComparison + "Equal";
} else {
    cloneComparison = cloneComparison + "Not Equal";
}
System.println(cloneComparison);