簡體   English   中英

用Java封裝

[英]Encapsulation with Java

我正在嘗試在程序中實現封裝,這是一些課程的一部分,但是我遇到了一個錯誤,我似乎無法用我有限的知識來解決這個問題,而我的老師/講師沒有幫助他。非常擅長於他所做的事情,但是實際上在交流信息時卻做得不太好,因此有人可以幫助我解決以下程序中顯示的錯誤,並向我解釋為什么它無法按預期工作。

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:錯誤:類Rectangle中的方法范圍不能應用於給定類型; System.out.println(“周長為” + r.perimeter()); ^必填:double,double found:無參數原因:實際參數和形式參數列表的長度不同1錯誤–

你打電話時:

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;
}

Rectangle類中的方法perimeter需要兩個參數,並且您不會傳遞任何參數。 您可以這樣稱呼它:

r.perimeter(7.8,4.2);

或重新定義方法,使其看起來像這樣:

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

那是因為您正在定義perimeter功能,如下所示:

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

並調用System.out.println("The perimeter is " + r.perimeter()); 沒有參數。

由於您並沒有真正使用double hdouble w ,因此只需將它們從方法定義中刪除

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

由於每個人都只是面對參數問題,所以我將面對這個問題:如果您不在類的外面,則使用Getter獲取私有字段的值! 如果您使用的是類中的方法,則不必使用getter,您可以自己使用變量:

例:

public class SomeClass {
    private int a;

    public void setA(int anotherA) {
        a = anotherA;
    }
    public int getA() {
        return a;
    }

    public int getSquareOfA() {
        // You don't use getA() to get the value now 
        // but you use a itself!
        return a*a;    // instead of 'return getA() * getA();'
    }
}

您的代碼中確實有幾個問題!

根據您的問題:

您的問題是您要調用的方法具有2個參數,而沒有任何輸入參數!

您可以刪除方法的參數(在您的情況下,這樣做在邏輯上是正確的), 或者您可以傳遞一些參數。

在您的特定情況下,請按以下方式更改您的perimiter()方法:

double perimiter() {
    return (height + width) * 2;
    // or if you want to impress your teacher ;) :
    // return (height + width) << 1
}

另外,您應該將該方法getPerimiter()更改為getPerimiter()以符合您自己的命名約定!

修改您的簽名以刪除參數。

class Rectangle extends TwoDShapeEncap{
    ///...

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

應該

class Rectangle extends TwoDShapeEncap{
    ///...

    double perimeter(){
        //Notice that you don't need to pass in these arguments 
        //as this function gets these arguments by itself. 
        return getHeight() * 2 + getWidth() * 2;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM