`
danielhjd
  • 浏览: 246363 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

提问:为什么在Operate这个方法中运行后,X的值改变,但Y没有?

    博客分类:
  • JDBC
 
阅读更多

代码: 

package test;

public class Daniel {
	static void operate(StringBuffer x,StringBuffer y){
		System.out.println("x="+x);
		System.out.println("y="+y);
		x.append(y);
		System.out.println("x="+x);
		System.out.println("x.toString()="+x.toString());
		y=new StringBuffer(x.toString());
		System.out.println("y="+y);
		System.out.println("------------------------");
	}
	public static void main(String[] args) {
		StringBuffer a =new StringBuffer("X");
		StringBuffer b =new StringBuffer("Y");
		operate(a,b);
		System.out.println("a="+a);
		System.out.println("b="+b);
		System.out.println(a +","+b);

	}

}

 

输出结果:

x=X
y=Y
x=XY
x.toString()=XY
y=XY
------------------------
a=XY
b=Y
XY,Y

 

分析:

operate()方法中,已经将“x”,“y”重新赋值,“x”,“y”都等于xy,但是在运行operate()后面的程序时,“a”的值变成xy而“b”的值没有变,这是为什么了?

 

在主函数中调用类的含参方法的运行轨迹:

主函数注入(参数) ---->注入(参数),在类方法中运行(重新赋值和运算)--输入结果--->被其他的类的方法调用--->输出结果

 

在这个过程中实际上是单个方法本身对注入的参数的值进行改变,并没有对注入的参数(对象本身)进行改变。所以在其他类方法调用该参数本身是,任然是初始值。在这里值得注意的是:应为StringBuffer()类中的append();insert();delete();reverse();replace()等方法,是可以对对象本进行修改和操作的...

 

扩展:

StringBuffer a =new StringBuffer("X");
System.out.println("a的字符数是"+a.capacity());
System.out.println("a的长度是"+a.length());

 输出结果:

--a的字符数是17
--a的长度是1

StringBuffer a=New StringBuffer(); 默认的是16char。

 

下面是一个与上面例子相关的题目,试试写出结果:

package test;

public class App {
	int x=1;
	public static void getNew(int x,int y){
		y+=x;
		x+=y;
		System.out.println("getNew()中y="+y);
		System.out.println("getNew()中x="+x);
	}
	public static int getChange(int x,int y){
		y+=x;
		x+=y;
		return x;
	}
	
	void getChanged(int x,int y){
		y+=x;
		x+=y;
		this.x=x;
	}
	public static void main(String[] args) {
		int x=10;
		int y=5;
		getNew(x,y);
		System.out.println("x="+x+" and y="+y);
		getChange(x,y);
		System.out.println("getChange()中的x="+getChange(x,y));
		System.out.println("x="+x+" and y="+y);
		App t=new App();
		System.out.println("t.x="+t.x);
		t.getChanged(x, y);
		System.out.println("t.x="+t.x);
		System.out.println("x="+x+" and y="+y);

	}

}

 

 

输出结果:

getNew()中y=15
getNew()中x=25
x=10 and y=5
getChange()中的x=25
x=10 and y=5
t.x=1
t.x=25
x=10 and y=5

 

原创请勿转载.......

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    SCJP Braindump SCJP 题库 SCJP 考题

    - `SychTest`类中的`setX`和`setY`方法没有被声明为`synchronized`,因此它们可以在不同的线程中并发执行。 **结论:** 正确答案为C(当多个线程分别调用`setX`和`setY`时,`check()`可能会返回`true`)。 #### ...

    Java中的值传递和引用传递的区别.doc

    **解析**:在这个例子中,`a`和`b`的值并没有被交换,因为在`change()`方法中交换的是它们的副本,而不是原始数据。 #### 三、对象类型的引用传递 Java中除了基本数据类型外,还有诸如类、数组等复合数据类型。当...

    camunda-operate-1.0.0.zip

    总的来说,这个压缩包为用户提供了完整的Zeebe和camunda-operate环境,让用户能够快速部署和试用Zeebe的工作流引擎,以及通过camunda-operate进行监控和管理。通过仔细阅读文档,配置服务,并按照启动脚本运行,用户...

    DeltaV Operate组态工具小技巧

    在DeltaV Operate组态工具的使用过程中,经常会遇到一些不被广泛注意但又非常实用的小技巧。这些技巧不仅能提高工作效率,还能避免一些常见的问题。本文将详细介绍几个重要的小技巧,并给出具体的使用方法。 #### ...

    JAVAWord版.pdf

    `后,`s`的值为14,但在`main`方法中打印`s`时,由于没有初始化,显示为4。 4. **方法参数传递**: - 在`operate`方法中,`y`是未定义的局部变量,尝试使用`y.append(x);`会导致编译错误。此外,`y=x;`只是将`x`的...

    C#OperateWord

    1. **创建Word应用实例**:首先,我们需要创建一个Word.Application实例,这使得我们可以在C#代码中启动一个新的Word进程或者连接到已存在的Word实例。 ```csharp using Microsoft.Office.Interop.Word; ...

    java笔试题

    ` 将`x`的引用赋给了`y`,即`y`现在指向`x`所指向的对象,但不会改变`a`或`b`的值。 - 方法返回后,`a`和`b`的值仍然保持不变。 **答案**:A. 代码编译并打印“A,B” ### 5. 继承与方法覆盖 **题目描述**:此题...

    147 SCJP 考试经典试题库

    在`operate`方法中,`x.append(y)`会将`y`的值追加到`x`后面,但`y = x`仅仅改变了局部变量`y`的引用,而不会影响到`main`方法中的`b`。因此,`a`现在包含了`"AB"`,而`b`仍然是`"B"`。所以,输出应为`AB,B`。 ####...

    operate_xlsx.zip

    这个压缩包包含了示例代码,用于演示如何在Go语言环境中读取、创建、写入以及保存xlsx文件。遵循以下步骤,你将能够熟练地运用Go进行xlsx文件操作。 首先,你需要安装必要的库。Go语言中,我们可以使用"github....

    Operate_应用_ISO带变量程序转化方法_2021.pdf

    在ISO编程中,宏变量提供了更高级别的灵活性,允许程序员在程序中使用动态值,然而,SINUMERIK 828D系统默认并不直接支持这类程序。以下是对ISO带变量程序转化方法的详细说明: 1. **免责声明**:使用本手册中的...

    SCJP试题2011

    在`operate`方法中,首先执行`x.append(y)`,将`y`的值追加到`x`后面,此时`x`的内容为“AB”。然后执行`y = x`,这实际上只是改变了`y`的引用,使其指向与`x`相同的对象,但不会改变`y`原有内容。因此,在`main`...

    JAVAWord版.docx

    11. **未完成的代码段**:最后一个例子`Pass`类中的`m`方法没有完成,因此这里不提供具体解释,但通常一个公共方法应该有相应的实现。 以上就是基于给定内容解析的Java编程基础知识和常见错误。理解并避免这些错误...

    java基础测试题

    然而,在这个示例中,`flag` 的初始值被设置为 `false`,因此 `sample()` 方法永远不会被调用。这意味着程序会正常终止,但没有任何输出。因此,正确答案是 B。 ### 题目二 **题目描述**:尝试编译并运行以下代码...

    某公司的java水平测试题

    - **最终输出**:`x` 在调用 `myMethod()` 后变为 6,`y` 的值为 10,因此输出为 `4 + 10 + 7 = 21`,但该选项未列出。 - **正确答案**:没有列出正确的答案。按照题目给出的选项,最接近的答案是 E. 打印 7。 ### ...

    scjp study material

    在Java中,整数类型默认为32位有符号整数,因此这个值表示的是一个负数。转换成二进制形式后,我们可以看到它实际上表示的是-15(因为最高位是符号位,这里为1表示负数)。接着,我们使用按位取反操作符`~`对`i`进行...

    西门子Operate_手册_828D铣削宏程序简明手册_2019.pdf

    "西门子 Operate 手册_828D 铣削宏程序简明手册_2019.pdf" 该手册主要介绍西门子 Operate 828D 铣削宏程序的基本概念、特点、用途以及宏变量的使用。下面是对该手册的详细知识点总结: 宏程序概述 * 宏程序是一种...

    部分Java考试真题

    在`operate`方法内,`x.append(y)`将`y`的内容追加到`x`,然后`y=x`使`y`引用`x`所指向的对象。但是,这不会改变`main`方法中`b`的引用,所以`b`依然指向原来的`"B"`。因此,代码执行后,`a`的内容为"AB",`b`的内容...

    文本操作方法OpenFile and operateFile

    在C#编程中,"文本操作方法OpenFile and operateFile"是两个关键概念,它们是进行文件处理的基础。本文将详细讲解如何使用C#来打开文件(OpenFile)以及对文件进行操作(operateFile),这对于任何希望深入学习C#...

Global site tag (gtag.js) - Google Analytics