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

Java 分配变量,然后在参数中使用变量?

Java 分配变量,然后在参数中使用变量?,java,Java,我正在做这些免费的斯坦福在线课程,学习Java。我被什么东西卡住了,一直没能弄明白。我想我的逻辑一定有问题。请查看下面的代码。我对它进行了评论,所以希望你能理解我在那里想做什么 import acm.graphics.*; import acm.program.*; import java.awt.*; public class Pyramid extends GraphicsProgram { /** Width of each brick in pixels */ private

我正在做这些免费的斯坦福在线课程,学习Java。我被什么东西卡住了,一直没能弄明白。我想我的逻辑一定有问题。请查看下面的代码。我对它进行了评论,所以希望你能理解我在那里想做什么

import acm.graphics.*;
import acm.program.*;
import java.awt.*;

public class Pyramid extends GraphicsProgram {

/** Width of each brick in pixels */
    private static final int BRICK_WIDTH = 30;

/*  Width of each brick in pixels */
    private static final int BRICK_HEIGHT = 12;

/** Number of bricks in the base of the pyramid */
    private static final int BRICKS_IN_BASE = 14;

/** The Width of the Base in px  */ 
    double baseInPx = BRICKS_IN_BASE * BRICK_WIDTH;

/** Taking the width of the window minus the width of the base and dividing by two 
 * to find the x axis starting point)   
 */
    double firstBrick = (getWidth() - baseInPx) / 2;

/* giving the y axis a variable name  */
        double baseHeight = getHeight();

    public void run() {

        add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

    }   

}
我想我在这一行的格式设置上一定出了问题:

double firstBrick = (getWidth() - baseInPx) / 2;
问题是x轴上的变量不起作用。如果我在那里硬编码一个数字,则会显示rect,但不会使用
firstBrick

谢谢你的帮助


编辑:谢谢大家的帮助!你们几乎每个人都是对的。我刚刚学到了一些东西

我要试着帮你自己。尝试将计算移到run方法中,并打印出值,以查看它与硬编码值时所期望的值有何不同。

我将尝试帮助您自助。尝试将计算移到run方法中,并打印出值,以查看它与硬编码值时的预期值有何不同。

将firstBrick和baseHeight移到run方法中,然后查看是否有效

public void run() {
    double firstBrick = (getWidth() - baseInPx) / 2;
    double baseHeight = getHeight();

    add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

}
我猜您的getWidth()和getHeight()是实例方法,而不是静态方法。因此,您不能在对象初始化块中调用它们(在示例代码中:任何方法之外的inits),因为金字塔对象尚未完全初始化


您还可以声明变量所在的位置,并在金字塔构造函数中初始化它们,这是首选方法。这就是构造器的作用。

将firstBrick和baseHeight都移动到run方法中,看看是否有效

public void run() {
    double firstBrick = (getWidth() - baseInPx) / 2;
    double baseHeight = getHeight();

    add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

}
我猜您的getWidth()和getHeight()是实例方法,而不是静态方法。因此,您不能在对象初始化块中调用它们(在示例代码中:任何方法之外的inits),因为金字塔对象尚未完全初始化


您还可以声明变量所在的位置,并在金字塔构造函数中初始化它们,这是首选方法。这就是构造函数的用途。

看看这段代码

public class Assignment {

    private String a = setString();
    private String b;

    public Assignment() {
        b = "set in constructor";
    }

    private String setString() {
        return b;
    }

    private String getA() {
        return a;
    }

    public static void main(String[] args) {
        System.out.println(new Assignment().getA());
    }

}
这将打印空


我猜类似的事情正在发生。可能金字塔的宽度和高度是在构造过程中设置的,所以在那里调用getWidth和getHeight时默认为0.0。

看看这段代码

public class Assignment {

    private String a = setString();
    private String b;

    public Assignment() {
        b = "set in constructor";
    }

    private String setString() {
        return b;
    }

    private String getA() {
        return a;
    }

    public static void main(String[] args) {
        System.out.println(new Assignment().getA());
    }

}
这将打印空


我猜类似的事情正在发生。可能金字塔的宽度和高度是在构造函数中设置的,因此在那里调用getWidth和getHeight时默认为0.0。

尝试在run方法中或在构造函数中设置firstBrick和baseHeight

import acm.graphics.*;
import acm.program.*;
import java.awt.*;

public class Pyramid extends GraphicsProgram {

    private static final int BRICK_WIDTH = 30;
    private static final int BRICK_HEIGHT = 12;
    private static final int BRICKS_IN_BASE = 14;
    double baseInPx = BRICKS_IN_BASE * BRICK_WIDTH;

    double firstBrick;
    double baseHeight;

    public void run() {
       firstBrick = (getWidth() - baseInPx) / 2;
       baseHeight = getHeight();

       add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

    }   

}

尝试在run方法或构造函数中设置firstBrick和baseHeight

import acm.graphics.*;
import acm.program.*;
import java.awt.*;

public class Pyramid extends GraphicsProgram {

    private static final int BRICK_WIDTH = 30;
    private static final int BRICK_HEIGHT = 12;
    private static final int BRICKS_IN_BASE = 14;
    double baseInPx = BRICKS_IN_BASE * BRICK_WIDTH;

    double firstBrick;
    double baseHeight;

    public void run() {
       firstBrick = (getWidth() - baseInPx) / 2;
       baseHeight = getHeight();

       add(new GRect(firstBrick,baseHeight,BRICK_WIDTH, BRICK_HEIGHT));

    }   

}

您的问题是这一行:

double firstBrick = (getWidth() - baseInPx) / 2;
double firstBrick=(getWidth()-baseInPx)/2

在执行此行时,getWidth()返回0;该操作将导致不会绘制的负数


如前所述,您必须在构建UI后调用该函数。->run()

您的问题是这一行:

double firstBrick = (getWidth() - baseInPx) / 2;
double firstBrick=(getWidth()-baseInPx)/2

在执行此行时,getWidth()返回0;该操作将导致不会绘制的负数


如前所述,您必须在构建UI后调用该函数。->run()

这似乎确实奏效了。虽然我的理解是getHeight和getWidth用于调用实际图形框的属性,但这让我感到困惑。这仍然被认为是实例方法的一部分吗?这是正确的,但在对象完全构造之前,您不能依赖它初始化所有属性。SCJP的书中有一节是关于对象初始化序列的,这是一本学习Java细节的好书。这似乎确实奏效了。虽然我的理解是getHeight和getWidth用于调用实际图形框的属性,但这让我感到困惑。这仍然被认为是实例方法的一部分吗?这是正确的,但在对象完全构造之前,您不能依赖它初始化所有属性。SCJP的书中有一节是关于对象初始化序列的,这是一本学习Java细节的好书。我很感激。将计算放在run方法中确实做到了这一点。我现在试图理解为什么:-D…啊,这是因为“baseInPx”指的是实例方法吗?baseInPx是使用实例方法getWidth()计算的-这在实例的上下文之外没有意义。run方法是一个实例方法,与金字塔的实例相关联。我很感激。将计算放在run方法中确实做到了这一点。我现在试图理解为什么:-D…啊,这是因为“baseInPx”指的是实例方法吗?baseInPx是使用实例方法getWidth()计算的-这在实例的上下文之外没有意义。run方法是一个实例方法,与金字塔的实例关联。