Ø 首先先举几个引用数据类型的例子:
String StringBuffer 类(包括自己定义的一些类和包中有的类) integer 等
Ø 下面的是基本数据类型
Int double char Boolean 等
表面上可以看出两个区别(单从类的角度来看):
1. 引用数据类型必须要实例化之后才可以使用,(String 和 integer除外)
注:String是一个很特殊的引用数据类型
Inteter是在在使用的过程中会自动的装箱和拆箱
例如:StringBuffer sb = new StringBuffer();
2. 引用数据类型或多或少的会有一些属性和方法
例如:类里面包含的就是属性和方法,比如StringBuffer里面就有append()方法 还有charAt()方法
深入点看:
3. 引用数据类型是指针的指向,基本数据类型则在内存中直接得到
1.下面一个例子是一个值传递的过程
例如:
下面是一个类的方法
public void changeNumber(int a,int b)
{
int temp=a;
a=b;
b=temp;
System.out.println("交换后的两数 a="+a+" b="+b);
}
在main方法中public static void main(String[] args)
{
//实例化的一个过程
Exam9 ex=new Exam9();
int a=10;
int b=5;
System.out.println("交换前的两数 a="+a+" b="+b);
//调用交换的方法
ex.changeNumber(a, b);
System.out.println("方法调用后的两数 a="+a+" b="+b);
}
运行的结果是:
交换前的两数 a=10 b=5
交换后的两数 a=5 b=10
方法调用后的两数 a=10 b=5
这个是许多人都会犯的错误,包括我也犯了这个错误
就是:方法调用后的两数 a=5 b=10
解释:a变量和b变量在内存中的值已经有了,并且值是固定的
基本数据类型的传递是一个值传递的过程
2.下面的一个例子是一个引用类型的传递
里面有一个user类:里面有一个属性:String name =“tom”;
public void changeName(User user,String name)
{
user.name=name;
}
User user=new User();
System.out.println("更改前的用户姓名:"+user.name);
//调用更改名字的方法
ex.changeName(user, "jack");
System.out.println("更改后的用户姓名:"+user.name);
结果是:更改前的用户姓名:tom
更改后的用户姓名:jack
这个是个引用的数据类型,
引用数据类型就是一个指针的一个指向。
1. 这个例子也是一个引用数据类型的例子
public void change(StringBuffer bufferA,StringBuffer bufferB,StringBuffer bufferC)
{
bufferA=new StringBuffer("AA");
bufferB.append("B");
bufferC=bufferA;
bufferC.append("C");
System.out.println("方法中:");
System.out.println(bufferA);
System.out.println(bufferB);
System.out.println(bufferC);
}
/**
* @param args
*/
public static void main(String[] args)
{
StringBuffer bufferA=new StringBuffer("A");
StringBuffer bufferB=new StringBuffer("B");
StringBuffer bufferC=new StringBuffer("C");
Exam10 ex=new Exam10();
ex.change(bufferA, bufferB, bufferC);
System.out.println("方法外");
System.out.println(bufferA);
System.out.println(bufferB);
System.out.println(bufferC);
}
运行的结果:
方法中的值大家都会的:
方法中:
AAC
BB
AAC
方法外
A
BB
C
关键是方法外面的System.out.println(bufferA);
这个比较难理解:
因为在方法体内部,有实例化了一个A对象,所以在方法里面的bufferA指向的是方法里面的A对象。和外面的没有联系。所以外面的还是指向原来的A对象,所以结果是A。