用Java封装

Jam*_*ger 1 java oop encapsulation

我试图在一个程序中实现封装作为一些课程的一部分但是我遇到了一个错误,我似乎无法用我有限的知识来解决这个问题,这对我的老师/讲师没有帮助.非常擅长他所做的事情,但是当它实际传达信息时却做得不好,因为有人可以帮我修复以下程序中出现的错误,并向我解释为什么它没有按预期工作.

class TwoDShapeEncap{
    double width, height;

    //Width
    void setWidth(double w){
        width = w;
    }

    double getWidth(){
        return width;
    }
    //Height
    void setHeight(double h){
        height = h;
    }

    double getHeight(){
        return height;
    }
}

class Triangle extends TwoDShapeEncap{
    String type;
    private double sideA, sideB, sideC, adjacent, opposite;

    //Side A
    void setsideA(double a){
        sideA = a;
    }
    double getsideA(){
        return sideA;
    }
    //Side B
    void setsideB(double b){
        sideB = b;
    }
    double getsideB(){
        return sideB;
    }
    //Side C
    void setsideC(double c){
        sideC = c;
    }
    double getsideC(){
        return sideC;
    }
    //Adjacent
    void setadjacent(double a){
        adjacent = a;
    }
    double getadjacent(){
        return adjacent;
    }
    //Opposite
    void setopposite(double o){
        width = o;
    }
    double getopposite(){
        return opposite;
    }

    double getPerimeter(){
        if(getsideB() == 0.0 && getsideC() == 0.0){
            type = "equilateral";
            return getsideA() * 3;
        }
        else if (getsideC() == 0.0){
            type  = "isosceles";
            return getsideA() + getsideB() * 2;
        }
        else{
            type = "scalene";
            return getsideA() + getsideB() + getsideC();
        }
    }


    //*******************************************************************************************
    //* Paste the perimeter() and hypotenuse() methods from your previous class into this class *
    //*******************************************************************************************

    //***************************************
    //* add an area method()into this class *
    //***************************************

    double area(double a, double b){
        getWidth();
        getHeight();
        return (getWidth() * getHeight()/2);
    }
}

class Rectangle extends TwoDShapeEncap{
    boolean issquare;

    private double height, width;

    //Height
    void setHeight(double h){
        height = h;
    }
    double getHeight(){
        return height;
    }
    //Width
    void setWidth(double w){
        width = w;
    }
    double getWidth(){
        return width;
    }

    double perimeter(double h, double w){
        getHeight();
        getWidth();
        return getHeight() * 2 + getWidth() * 2;
    }

    double area(double a, double b){
        //getWidth();
        //getHeight();
        return (getWidth() * getHeight()/2);
    }

    boolean testSquare(double h, double w){
        //getHeight();
        //getWidth();
        if (getHeight() == getWidth())
            issquare = true;
        else issquare = false;
        return issquare;
    }

    //*********************************************
    //* add area and perimeter methods this class *
    //*********************************************

    //*************************************************************************
    //* add a testSquare method to test if a particular rectangle is a square *
    //*************************************************************************

}

//Add a circle class which includes area and circumference methods

class Circle extends TwoDShapeEncap{
    double radius, diameter;

    double area (double r){
        radius = r;
        return Math.PI * (radius * radius);
    }

    double perimeter (double r){
        radius = r;
        return 2 * (Math.PI * radius);
    }
}

class TwoDShapeEncapDemoNew {
    public static void main(String args[]) {
    //Triangle
    Triangle t = new Triangle();
    t.setsideA(5.7);
        System.out.println("The perimeter is " + t.getPerimeter());
        System.out.println("If sideA is " + t.getsideA() );
        System.out.println("The type is " + t.type);
        System.out.println();
    t.setsideB(7.3);
        System.out.println("The perimeter is " + t.getPerimeter());
        System.out.println("If sideA is " + t.getsideA() );
        System.out.println("If sideB is " + t.getsideB() );
        System.out.println("The type is " + t.type);
        System.out.println();
    t.setsideC(2.7);
        System.out.println("The perimeter is " + t.getPerimeter());
        System.out.println("If sideA is " + t.getsideA());
        System.out.println("If sideB is " + t.getsideB());
        System.out.println("If sideC is " + t.getsideC());
        System.out.println("The type is " + t.type);
        System.out.println();
        //Rectangle
        Rectangle r = new Rectangle();
    r.setHeight(7.8);
    r.setWidth(4.2);
        System.out.println("The perimeter is " + r.perimeter());
        System.out.println("The");

    }
}
Run Code Online (Sandbox Code Playgroud)

错误信息:

Main.java:186:错误:类Rectangle中的方法周长不能应用于给定的类型; System.out.println("周长为"+ r.perimeter()); ^必需:double,double found:无参数原因:实际和形式参数列表长度不同1错误 -

Joe*_*ras 5

你打电话的时候:

System.out.println("The perimeter is " + r.perimeter());
Run Code Online (Sandbox Code Playgroud)

在r.perimeter中你必须传递两个参数(如你的签名所需)

你在Rectangle类中的方法:

double perimeter(double h, double w){
    getHeight();
    getWidth();
    return getHeight() * 2 + getWidth() * 2;
}
Run Code Online (Sandbox Code Playgroud)

所以修复:

System.out.println("The perimeter is " + r.perimeter(r.getHeight(), r.getWidth()));
Run Code Online (Sandbox Code Playgroud)

您还可以在没有参数的情况下修复方法边界,因为在正文中使用了getHeigth()和getWidth()属性

所以你可以写:

double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}
Run Code Online (Sandbox Code Playgroud)