JAVA中申请了两个对象,分别在调用方法和声明方法中把其中一个对象直接赋值给另外一个对象,运行结果,求原理。
2014-09-29 22:27
741 查看
public class TestYinYong {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
//输出a,b的初值 :A,B
System.out.println(a + ","+b);
operate(a,b);
//输出a,b经过一定操作后(operator()方法)的值:AB,B
System.out.println("方法执行后输出:" + a + ","+b);
b=a;
//输出将a赋给b后的值:AB,AB
System.out.println("声明引用处赋值输出:" + a + ","+b);
}
private static void operate(StringBuffer a, StringBuffer b) {
a.append(b);
b=a;
//AB ,AB
System.out.println("方法执行过程赋值输出:" + a + ","+b);
}
}
以上代码输出结果如下:
A,B
方法执行过程赋值输出:AB,AB
方法执行后输出:AB,B
声明引用处赋值输出:AB,AB
上述只是解释了在声明时,两个对象间赋值的结果。而如果在调用方法中,将这两个对象赋值后,在声明方法中输出的结果和没有赋值是一样的。我觉得应该是因为调用方法中,又重新想虚拟机申请了变量,声明中的b和方法调用中b不一样,但是a为什么一样呢?我只是将结果运行出来了,求解释。
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
//输出a,b的初值 :A,B
System.out.println(a + ","+b);
operate(a,b);
//输出a,b经过一定操作后(operator()方法)的值:AB,B
System.out.println("方法执行后输出:" + a + ","+b);
b=a;
//输出将a赋给b后的值:AB,AB
System.out.println("声明引用处赋值输出:" + a + ","+b);
}
private static void operate(StringBuffer a, StringBuffer b) {
a.append(b);
b=a;
//AB ,AB
System.out.println("方法执行过程赋值输出:" + a + ","+b);
}
}
以上代码输出结果如下:
A,B
方法执行过程赋值输出:AB,AB
方法执行后输出:AB,B
声明引用处赋值输出:AB,AB
在java中,关于对象的使用都是通过引用来实现的,引用实际上就是一个内存地址,我们说的对象a和对象b,变量a和变量b实际上就是一个引用变量指向一个内存地址,在这块内存地址上刚好储存的数据是对象而已。因此,a=b实际上就是将变量b的引用值(地址)赋给a变量,这么一来a和b都指向了原先b指向的对象,就是b的引用复制给了a。
上述只是解释了在声明时,两个对象间赋值的结果。而如果在调用方法中,将这两个对象赋值后,在声明方法中输出的结果和没有赋值是一样的。我觉得应该是因为调用方法中,又重新想虚拟机申请了变量,声明中的b和方法调用中b不一样,但是a为什么一样呢?我只是将结果运行出来了,求解释。
相关文章推荐
- 5.编写一个程序,有两个类,其中类MAX中具有两个方法,方法名都是max,一个方法能够比较两个数的大小,另外一个方法能够比较三个数的大小。在另外一个类中创建对象,调用这两个方法,分别输出两组数:2、6
- 原!! java直接打印一个对象时,并不是直接调用该类的toString方法 ,而是会先判断是否为null,非null才会调用toString方法
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- JAVA调用系统命令或可执行程序--返回一个Runtime运行时对象,然后启动另外一个进程来执行命令
- react实现两个方法同时执行时,其中一个能够调用另一个的执行结果
- java面试题解惑:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
- js中直接声明一个对象的方法
- ios 中调用函数的方法是消息传递,这个和普通的函数调用的区别是,你可以随时对一个对象传递任何消息,而不需要在编译的时候声明这些方法。所以Objective-C可以在runtime的时候
- java 程序加载过程---3--类中申明同时申明类的静态对象 创建类的实例 访问类的静态变量 调用类的静态方法 使用反射方法 初始化类的子类对象 直接使用java.exe 调用某个类
- Flex一个RemoteObject调用JAVA对象里面的多个方法(转)
- 用JAVA语言编写程序:包含两个类,一个类Cricle中包含计算圆周长,面积的方法。在另一个类Compute中给出半径值为10,创建对象,并调用Cricle类中的方法,计算该对象的面积、周长并显示出结
- 【Java】两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合并入A并排序。
- 编写Java程序,模拟简单的计算器。 定义名为Number的类,其中有两个整型数据成员n1和n2,应声明为私有。 编写构造方法,用于初始化n1和n2,再为该类定义 加(addition)、 减(su
- java创建一个子类对象是会调用父类的构造方法会不会创建父类
- JAVA如何调用另外一个类的方法
- JavaScript中远程级联调用(RPC)java对象中的方法并返回结果
- Eclipse 想运行一个java文件,结果却运行了另外一个
- 将任务4的解决用一个项目多个文件的方式实现,其中两个类的声明放在一个.h文件中,每个类的成员函数分别放一个文件,main()函数用一个文件。
- 一个java包中有两个含Main的类的运行方法
- 尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将它向上转型到基类并调用这个方法。