Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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_Oop_Encapsulation - Fatal编程技术网

用Java进行封装

用Java进行封装,java,oop,encapsulation,Java,Oop,Encapsulation,我试图在一个程序中实现封装,作为一些课程的一部分,但是我遇到了一个错误,我似乎无法用我有限的知识来解决这个问题,这没有得到我的老师/讲师的帮助。我的老师/讲师非常擅长他所做的,但在实际交流信息方面做得并不好,因此,有人可以帮助我修复以下程序中出现的错误,并向我解释为什么它不能按预期工作 class TwoDShapeEncap{ double width, height; //Width void setWidth(double w){ width =

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

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

    }
}
错误消息:

java:186:错误:类矩形中的方法周长不能应用于给定的类型;System.out.println(“周长为”+r.permiture());^必需:双精度,双精度找到:无参数原因:实际参数列表和正式参数列表长度不同1错误-

当你打电话时:

System.out.println("The perimeter is " + r.perimeter());
在r.Permiture中,您必须传递两个参数(根据您的签名需要)

矩形类中的方法:

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;
}
当你打电话时:

System.out.println("The perimeter is " + r.perimeter());
在r.Permiture中,您必须传递两个参数(根据您的签名需要)

矩形类中的方法:

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
中的方法
permiture
需要两个参数,您不需要传递任何参数。你可以这样称呼它:

r.perimeter(7.8,4.2);
double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
    getHeight();
    getWidth();
    return getHeight() * 2 + getWidth() * 2;
}
或者重新定义该方法,使其如下所示:

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

Rectangle
中的方法
permiture
需要两个参数,您不需要传递任何参数。你可以这样称呼它:

r.perimeter(7.8,4.2);
double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
    getHeight();
    getWidth();
    return getHeight() * 2 + getWidth() * 2;
}
或者重新定义该方法,使其如下所示:

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

这是因为您是这样定义
周长
函数的:

r.perimeter(7.8,4.2);
double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
    getHeight();
    getWidth();
    return getHeight() * 2 + getWidth() * 2;
}
并调用
System.out.println(“周长为”+r.permiture())不带参数

由于您并不是无缘无故地使用
double h
double w
,因此您只需将它们从方法定义中删除即可

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

这是因为您是这样定义
周长
函数的:

r.perimeter(7.8,4.2);
double perimeter(){
    return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
    getHeight();
    getWidth();
    return getHeight() * 2 + getWidth() * 2;
}
并调用
System.out.println(“周长为”+r.permiture())不带参数

由于您并不是无缘无故地使用
double h
double w
,因此您只需将它们从方法定义中删除即可

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

修改签名以删除参数

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

修改签名以删除参数

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

因为每个人都面临着参数的问题,所以我将面临这个问题:如果你在你的类之外,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();'
    }
}
在代码中的几个点上确实存在这个问题

根据您的问题:

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
}
double perimiter(){
返回(高度+宽度)*2;
//或者如果你想给老师留下深刻印象;):

//return(height+width)因为每个人都面临参数的问题,所以我将面临这个问题:如果你在类的“外部”,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();'
    }
}
在代码中的几个点上确实存在这个问题

根据您的问题:

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
}
double perimiter(){
返回(高度+宽度)*2;
//或者如果你想给老师留下深刻印象;):

//return(height+width)几乎忘了提到错误消息:Main.java:186:error:classrectangle中的方法periment不能应用于给定的类型;System.out.println(“periment是”+r.periment());^required:double,double found:no arguments原因:实际参数列表和形式参数列表长度不同1 errorDear,发布错误Joe的答案是正确的,但您的IDE肯定会注意到这一点,不是吗?几乎忘了提到错误消息:Main.java:186:error:class Rect中的方法周长角度不能应用于给定的类型:System.out.println(“周长为”+r.Permiture());^required:double,double found:no arguments原因:实际参数列表和正式参数列表长度不同1 errorDear,发布错误Joe的答案是正确的,但您的IDE肯定会注意到这一点,不是吗?perimiter方法中不需要前2行,也不需要不使用直接初始化字段!如果您有一个矩形类,并且您使用
setWidth()
setHeight()
定义了宽度和高度,那么为什么不需要呢?至于getWidth()和getHeight()我删除了它们,因为width和height的值已经存储在width和height类变量中!您的意思是我应该使用
this.width
而不是