1.基本类型与引用类型区别
对于基本类型(int , long , short , double , char , byte , float , boolean ),变量直接保存数据的值;
对于引用类型,变量保存的是对象的地址,由此地址指向实际对象。如图:
int a=10
String ss="hello world";
对于基本类型,直接传值,方法里进行重新赋值不会导致原值改变:
public class Test {
public static void change(int n){
n=10;
}
public static void main(String[] args) {
int n = 0;
change(n);
System.out.println(n);
}
}
输出:0
public class Test {
public static void change(String n){
n += "world";
}
public static void main(String[] args) {
String n = "hello";
change(n);
System.out.println(n);
}
}
输出:hello
String是引用类型,按理说应该方法中的值会改变原来的值,但是这里输出的是hello。因为String这种引用类型比较特殊,其实传入方法的是一个副本,不管方法内怎么改变String的值,都是使副本指向了这个string 值。
main方法内的n一开始指向的是hello这块数据,调用change方法时,传入的是n的一个副本,相当于重新new 一个String,所以对其的操作并不会对外面的n造成影响。
2.数组
public class Test {
public static void change(char[] c, int[] ii) {
c[0] = 'g';
ii[0] = 8;
}
public static void main(String[] args) {
char[] c = { 'a', 'b', 'c' }; // 数组
int[] ii = { 1, 2, 3 };// 数组
change(c,ii);
System.out.println(c[0] + " " + ii[0]);
}
}
输出:g 8
数组也是引用类型,传入的是引用,在方法内操作会改变原始值。
3.对于对象
public class Test {
public static void change(Student s) {
s.name = "lisi";
}
public static void main(String[] args) {
Student s = new Student();
s.name = "zhangsan";
change(s);
System.out.println(s.name);
}
}
class Student {
String name;
}
输出: lisi
对象是引用类型,会改变原始值~
再看个例子:
public class Test {
public static void change(Student s) {
s = new Student();
s.name = "lisi";
}
public static void main(String[] args) {
Student s = new Student();
s.name = "zhangsan";
change(s);
System.out.println(s.name);
}
}
class Student {
String name;
}
输出: zhangsan
这个传入的虽然是引用类型,但方法内部改变了原对象的指向,方法内操作的相当于一个新的对象。所以不会改变原对象的属性。
传入时,方法内s 跟main方法内的s都是指向zhangsan,当change方法里面重新new 一个Student并赋值后,change方法里的s已经指向了一个新的对象,main方法里还是指向原来的对象,并不会因为change方法里的操作做任何改变。
最后一个:
public class Test {
public static void change(Student s) {
s = new Student();
s.name = "lisi";
}
public static void main(String[] args) {
Student s = new Student();
s.name = "zhangsan";
change(s);
System.out.println(s.name);
}
}
class Student {
static String name;
}
输出: lisi
这个例子相比上个例子就是将Student的name属性变成了static,全局变量了,这样即使在change方法内重新new了一个对象,指向不同,也还是会改变这个属性的,道理很简单, 全局变量啊!