Java中的基本类型和引用类型变量的区别
2007-09-26 15:57
281 查看
基本类型:
基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值。
引用类型:
是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。
举例说明:
int a;
a=250; //声明变量a的同时,系统给a分配了空间。
引用类型就不是了,只给变量分配了引用空间,数据空间没有分配,因为谁都不知道数据是什么,整数,字符?我们看一个错误的例子:
MyDate today;
today.day = 4; //发生错误,因为today对象的数据空间未分配。
那我们怎么给它赋值?引用类型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问。举个例子:
MyDate today; //将变量分配一个保存引用的空间
today = new MyDate(); //这句话是2步,首先执行new MyDate(),给today变量开辟数据空间,然后再执行赋值操作
//引用变量赋值
MyDate a,b; //在内存开辟两个引用空间
a = new MyDate(); //开辟MyDate对象的数据空间,并把该空间的首地址赋给a
b = a; //将a存储空间中的地址写到b的存储空间中
如下图示
引用传递 和 值传递
引用类型:除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。
值传递:基本类型的传递都属于值传递,和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。
/*define a class*/
class MyDate{
String Year;
String Month;
String Day;
String Date;
public MyDate(){
Year = "1900";
Month ="01";
Day = "01";
Date = Year + "." + Month + "."+ Day;
}
public String toString(){
return Date;
}
}
public class ObjRef{
MyDate mydate1 = new MyDate();
MyDate mydate2 = mydate1;// = 使 mydate1和 mydate2将指向同一内存空间
//MyDate mydate2 = new MyDate();//从新new一个对象,则mydate1和mydate2是指向不同的内存空间的:
//引用空/间和数据空间都不一样
public void changeObj(MyDate inObj){
inObj.Date = "2007.09.26";
}
public static void main(String[] args) {
ObjRef oRef = new ObjRef();
System.out.println("Before call changeObj() method: " + oRef.mydate1);
oRef.changeObj(oRef.mydate1);
System.out.println("After call changeObj() method: " + oRef.mydate1);
System.out.println("After call changeObj() method: " + oRef.mydate2);//验证“= mydate1和 mydate2将指向同一内存空间“这一结论
}
}
基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值。
引用类型:
是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。
举例说明:
int a;
a=250; //声明变量a的同时,系统给a分配了空间。
引用类型就不是了,只给变量分配了引用空间,数据空间没有分配,因为谁都不知道数据是什么,整数,字符?我们看一个错误的例子:
MyDate today;
today.day = 4; //发生错误,因为today对象的数据空间未分配。
那我们怎么给它赋值?引用类型变量在声明后必须通过实例化开辟数据空间,才能对变量所指向的对象进行访问。举个例子:
MyDate today; //将变量分配一个保存引用的空间
today = new MyDate(); //这句话是2步,首先执行new MyDate(),给today变量开辟数据空间,然后再执行赋值操作
//引用变量赋值
MyDate a,b; //在内存开辟两个引用空间
a = new MyDate(); //开辟MyDate对象的数据空间,并把该空间的首地址赋给a
b = a; //将a存储空间中的地址写到b的存储空间中
如下图示
引用传递 和 值传递
引用类型:除了在函数传值的时候是"引用传递",在任何用"="向对象变量赋值的时候都是"引用传递"。
值传递:基本类型的传递都属于值传递,和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是针对这个拷贝的操作,函数执行结束后,这个局部变量也就完成了它的使命,它影响不到作为输入参数的变量。这种方式的参数传递被称为"值传递"。
/*define a class*/
class MyDate{
String Year;
String Month;
String Day;
String Date;
public MyDate(){
Year = "1900";
Month ="01";
Day = "01";
Date = Year + "." + Month + "."+ Day;
}
public String toString(){
return Date;
}
}
public class ObjRef{
MyDate mydate1 = new MyDate();
MyDate mydate2 = mydate1;// = 使 mydate1和 mydate2将指向同一内存空间
//MyDate mydate2 = new MyDate();//从新new一个对象,则mydate1和mydate2是指向不同的内存空间的:
//引用空/间和数据空间都不一样
public void changeObj(MyDate inObj){
inObj.Date = "2007.09.26";
}
public static void main(String[] args) {
ObjRef oRef = new ObjRef();
System.out.println("Before call changeObj() method: " + oRef.mydate1);
oRef.changeObj(oRef.mydate1);
System.out.println("After call changeObj() method: " + oRef.mydate1);
System.out.println("After call changeObj() method: " + oRef.mydate2);//验证“= mydate1和 mydate2将指向同一内存空间“这一结论
}
}
相关文章推荐
- JAVA 对象定义、访问对象、基本类型和引用类型变量区别
- 66 Java final 修饰基本类型变量和引用类型变量的区别
- Java中的基本类型和引用类型变量的区别
- Java中的基本类型和引用类型变量的区别
- Java中的基本类型和引用类型变量的区别
- Java 中基本类型 和 引用类型 变量的区别
- Java中的基本类型和引用类型变量的区别
- java final 与引用类型变量和基本类型区别
- Java中的基本类型和引用类型变量的区别
- Java中的基本类型和引用类型变量的区别
- java中引用类型的变量和对象的区别
- Java自学之路-Java基础教程-9:Java的变量类型-8种基本类型和3种引用类型
- final修饰基本类型和引用类型变量的区别
- JS变量基本类型和引用类型的区别
- JAVA的基本数据类型和引用数据类型的区别
- java中基本数据类型和引用数据类型的区别?
- JAVA 基本类型与 引用类型区别
- java初学者实践教程5-基本类型和引用类型变量
- JAVA-基本数据类型与引用数据类型区别
- JAVA中变量,常量,基本类型,引用类型,数据类型转换