java - 用Java封装

标签 java oop encapsulation

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

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");

    }
}

错误信息:

Main.java:186: error: method perimeter in class Rectangle cannot be applied to given types; System.out.println("The perimeter is " + r.perimeter()); ^ required: double,double found: no arguments reason: actual and formal argument lists differ in length 1 error –

最佳答案

当你打电话时:

System.out.println("The perimeter is " + r.perimeter());

在 r.perimeter 中你必须传递两个参数(正如你的签名所希望的那样)

Rectangle 类中的方法:

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

所以修复:

System.out.println("The perimeter is " + r.perimeter(r.getHeight(), r.getWidth()));

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

所以你可以这样写:

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

关于java - 用Java封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33783300/

相关文章:

java - 以编程方式关闭 JOptionPane.ShowInternalOptionDialog

java - 使用#authentication 实用程序的 Spring Boot 和 Thymeleaf

java - Cassandra 用 Ja​​va 从文件中保存数据

Haskell 导出记录仅供读取访问

在运行时动态创建(封装)子项的 WPF 元素

java - 使用 jrxml 的动态报告

java - 如何使用导入另一个模式文件的模式文件验证 XML?

oop - 观察者模式还是回调?

javascript - JS 对象字面量中的方法和子方法

java - 使用 getY() 和 getX() 计算 2 点之间的距离