Java基础知识陷阱(二)
本文发表于本人博客。
上次说了一些关于字符串的知识,都是比较基础的,那这次也说下关于对象地址问题,比如传参。先看下面代码:
public void changeInt(int a){ a = 3; } int a = 1; changeInt(a); System.out.println(a);
我相信这个初学者也知道结果了,知道传的是值。那看下这个说出过程是如何的:
public void changestr(String str){ str = "www.luoliang.me"; } String s = "luoliang.me"; changestr(s); System.out.println(s);
这 样的代码我相信很多人也知道结果,但是问到具体过程如何好些人就不知道搞啥了包括当初我也是就简单的说了一两句完全没说到字符串池之类的点子上。这是描述 有关字符串内存转变的情况。首先我们知道先声明定义了一个参数为String的函数changestr,接着在字符串池中创建这 个"luoliang.me"(判断),创建完成之后接着调用了changestr方法,把s的地址就是在字符串池的"luoliang.me"地址给了 str变量,这个函数进行更改把str这个变量的指向重新指向另外一个"www.luoliang.me"的字符串,当然这个过程需要判断字符串池是否存在这个字符串。更改完后回来打印s的地址即是"luoliang.me"的地址。这个过程中,所有的字符串都未曾改变,因为是常量,改变的只是变量所指向的地址!
现在对于下面的代码我想就容易理解:
public class Test { public static void changePoint(Point point){ point.x = 3; point.y = 4; } public static void main(String[] args) { Point point = new Point(1, 2); System.out.println("x=" + point.x + ";y=" + point.y); changePoint(point); System.out.println("x=" + point.x + ";y=" + point.y); } } class Point{ int x; int y; public Point(int x,int y) { this.x = x; this.y = y; } }