传递值和无返回类型意味着什么也不发生? 在这个问题上,需要理解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
好的,那么,我将合并书面答案