1.Java中数据类型的存储
基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress,
引用类型包括:类类型,接口类型和数组。
Java中数据类型分为两大类,基本类型和对象类型。相应的,变量也有两种类型:基本类型和引用类型。
基本类型的变量保存原始值,即它代表的值就是数值本身;
而引用类型的变量保存引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,
对象本身存放在这个引用值所表示的地址的位置。
2.基本类型和引用类型在分配空间上的区别
基本数据类型在申明的时候就给该变量分配空间,因为基本数据类型占用的空间是指定的
引用数据类型在声明的时候只分配了应用空间,而不分配数据空间,比如
Date a,b;//在内存中开辟了两个引用空间
a = new Date();//new date()开辟了Date对象的数据空间,并把该空间的首地址赋给a
b=a;//将a存储空间的中的地址写到b的存储空间中
此时a和b指向的是同一块内存区域,ab各自的修改会影响到对方
class student{
String name;
public student(String name) {
this.name =name;
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class demo6 {
public static void main(String[] args) {
student a,b;
a = new student("bob");
b=a;
a.setName("bob2.0");
System.out.println(a.getName());
System.out.println(b.getName());
}
}
===>
bob2.0
bob2.0
引用也是占空间的
3.引用传递和值传递
java中都是值传递,不过传递的是地址
值传递:
方法调用时,实际参数把它的值传递给对应的形式参数,函数接收的是原始值的一个copy,此时内存中存在两个相等的基本类型,即实际参数和形式参数,后面方法中的操作都是对形参这个值的修改,不影响实际参数的值。
引用传递:
也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,函数接收的是原始值的内存地址;
在方法执行中,形参和实参内容相同,指向同一块内存地址,方法执行中对引用的操作将会影响到实际对象。
class student{
String name;
public student(String name){
this.name=name;
}
}
public class demo5 {
public static void change_name(student oStudent){
oStudent.name ="has been change";
}
public static void change_number(Integer a){
a =a+1;
}
public static void main(String[] args) {
student aStudent = new student("xiaoming");
System.out.println(aStudent.name);
change_name(aStudent);
System.out.println(aStudent.name);
int a = 1;
Integer aInteger = new Integer(4);
change_number(aInteger);
System.out.println(aInteger);
}
==>
xiaoming
has been change
4
所以:
(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
4.特殊类型
String,以及Integer、Double等几个基本类型包装类,它们都是immutable类型,因为没有提供自身修改的函数,每次操作都是新生成一个对象,所以要特殊对待,可以认为是和基本数据类型相似,传值操作。
但stringbuilder和stringbuffer就不一样,他们跟普通的引用类型一样
网友评论