Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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_Junit_Return - Fatal编程技术网

传递值和无返回类型意味着什么也不发生? 在这个问题上,需要理解Java。作为作者,我保持了原始问题的完整性,因为答案在澄清这些问题方面做得非常好

传递值和无返回类型意味着什么也不发生? 在这个问题上,需要理解Java。作为作者,我保持了原始问题的完整性,因为答案在澄清这些问题方面做得非常好,java,junit,return,Java,Junit,Return,请随意更改以下问题,以提高其作为教学工具的质量 我有一个包含一个方法的JAVA类,该方法接收一个整数数组对象(如代码中所示);然而,在JAVA中,一切都是一个公认的事实,即使用局部作用域对象或p无法覆盖作为参数传递的对象或基元类型。类型 换句话说,为了在Java中更改对象(原语或引用),必须通过有权更改属性的成员函数(或“方法”)直接或间接地访问数据成员(或“属性”)。简单地说,这种方法必须有效果 更改对象值的另一种方法是通过函数返回值,并将原始对象设置为返回值 以下是我的代码(以及接下来的问

请随意更改以下问题,以提高其作为教学工具的质量


我有一个包含一个方法的JAVA类,该方法接收一个整数数组对象(如代码中所示);然而,在JAVA中,一切都是一个公认的事实,即使用局部作用域对象或p无法覆盖作为参数传递的对象或基元类型。类型

换句话说,为了在Java中更改对象(原语或引用),必须通过有权更改属性的成员函数(或“方法”)直接或间接地访问数据成员(或“属性”)。简单地说,这种方法必须有效果

更改对象值的另一种方法是通过函数返回值,并将原始对象设置为返回值

以下是我的代码(以及接下来的问题):

代码框架。I:

public class BlockSort
{

    public static void sort(Block [] blocks)
    {
        boolean sorted = false;
        int length = blocks.length;

        while(!sorted)
        {
            sorted = true;

            for (int i = 1; i < length; i++)
            {
                if (blocks[i - 1].width > array[i].width)
                {
                    Block tempBlock = blocks[i - 1];
                    blocks[i - 1] = blocks[i];
                    blocks[i] = tempBlock;
                }
                else if ((blocks[i - 1].width == array[i].width) && (blocks[i - 1].length > array[i].length))
                {
                    Block tempBlock = blocks[i - 1];
                    blocks[i - 1] = blocks[i];
                    blocks[i] = tempBlock;
                }
            }

            length = length - 1;
    }

}
public myClass
{
    public void doesNothing(int someParameter)
    {
        someParameter = someParameter - 1;
    }
 }

因此,我的问题是:如果没有返回类型,传递给上述代码的任何值都不会真正起作用,对吗?换句话说,它无法用任何真正的影响力修改传递给它的内容(因为任何修改都是函数范围)。

Java是按值传递的,但对象和数组是引用类型。传递到
排序中的数组将与导出的数组相同(即,它将位于内存中的相同位置),但数组中的内容可能不同。

Java是按值传递的,但对象和数组是引用类型。传递到
sort
中的数组将与取出的数组相同(即,它将位于内存中的相同位置),但数组中的内容可能不同。

BlockSort.sort
方法确实有效。它通过值传递对
块[]
的引用。这并不意味着它不能更改数组内容


例如,如果使用
BlockSort.sort(myArray)
调用它,变量
myArray
将返回到同一数组实例。但是数组的内容可能会更改。

BlockSort.sort方法确实有效果。它通过值传递对
块[]
的引用。这并不意味着它不能更改数组内容

例如,如果使用
BlockSort.sort(myArray)
调用它,变量
myArray
将返回到同一数组实例。但是数组的内容可能会更改

我坚持认为该片段是不可测试的

您完全正确:无法从外部检测到对原语和不可变类型参数的更改;他们也不应该这样

[第二个代码片段]无法修改传递给它的内容

这也是事实。此外,可能根本不可能——考虑这个称呼:

mc.doesNothing(2*a*a + 3*b + c);
传递给
doesNothing
的值是从三个变量计算出来的,因此调用程序中没有可以修改的内容

在原始代码片段中,
int someParameter
doesNothing
方法实现的本地变量,这与从方法外部看不到本地变量的意义相同。测试它并不比“测试”方法的任何其他局部变量的更改更有意义

但是,另一个代码片段(code FRAG.I)则不同,因为Java数组既不是原始的,也不是不变的:

public static void sort(Block [] blocks) {
    // Any change to the content of blocks will be visible to the caller
}
因此,调用方可以看到对方法中的
数组执行的更改,就像调用方可以看到对任何其他可变对象的更改一样

我坚持认为该片段是不可测试的

您完全正确:无法从外部检测到对原语和不可变类型参数的更改;他们也不应该这样

[第二个代码片段]无法修改传递给它的内容

这也是事实。此外,可能根本不可能——考虑这个称呼:

mc.doesNothing(2*a*a + 3*b + c);
传递给
doesNothing
的值是从三个变量计算出来的,因此调用程序中没有可以修改的内容

在原始代码片段中,
int someParameter
doesNothing
方法实现的本地变量,这与从方法外部看不到本地变量的意义相同。测试它并不比“测试”方法的任何其他局部变量的更改更有意义

但是,另一个代码片段(code FRAG.I)则不同,因为Java数组既不是原始的,也不是不变的:

public static void sort(Block [] blocks) {
    // Any change to the content of blocks will be visible to the caller
}
因此,调用方可以看到对方法中的
数组执行的更改,就像调用方可以看到对任何其他可变对象的更改一样

我最终要问的是上述代码是否可测试

是的。您发布的代码在
数组中移动元素,您当然可以在方法返回后测试项目是否已排序

Block[] blocks = createBlocks();
BlockSort.sort(blocks);
for(int i = 1; i < blocks.length; i++) {
  assert blocks[i].width < blocks[i-1].width;
}
Block[]blocks=createBlocks();
块排序。排序(块);
对于(int i=1;i
我最终要问的是上述代码是否可测试

是的。您发布的代码在
数组中移动元素,您当然可以在方法返回后测试项目是否已排序

Block[] blocks = createBlocks();
BlockSort.sort(blocks);
for(int i = 1; i < blocks.length; i++) {
  assert blocks[i].width < blocks[i-1].width;
}
Block[]blocks=createBlocks();
块排序。排序(块);
对于(int i=1;i
好的,那么,我将合并书面答案