Java中,数据类型,总的来说,分为两种,基本数据类型和引用数据类型。
8种基本数据类型又分为:数值型、字符型、布尔型。
数值型分为,整数类型(byte,short,int,long)、浮点类型(float,double)。
String本身是一个类,是属于引用数据类型,任何数据类型和String相连,都会自动向String转换
引用数据类型分为,类、接口、数组。
创建对象时候的内存划分情况:对象在占内存中声明,在对内存中实例化
对象的声明是保存在栈内存中,对象的实例化内容是保存在堆内存中的,关键字new就是开辟堆内存空间,是实例化对象的过程,只开辟了栈内存的对象是无法使用的,必须有其堆内存的引用才可以使用,引用传递,其实传递的是堆内存的地址,对象的引用传递其实传递的是堆内存的使用权。一个堆内存可以有多个栈内存的引用。
再次强调,对象保存在占内存中,而具体的内容则保存在堆内存中,对象间的引用传递,实际上传递的就是堆内存空间的使用权
实例化对象并不单单指的是通过new关键字实现的,只要其有堆内存的空间指向,则就表示实例化成功。在引用操作中,如果一个对象没有堆内存的引用,而使用该对象调用了类中的属性或方法,就会出现,NullpointerException,就是空指针异常
class Person{
String name ; // 声明姓名属性
int age ; // 声明年龄属性
public void tell(){ // 取得信息
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
};
public class ClassDemo05{
public static void main(String args[]){
Person per1 = null ; // 声明per1对象
Person per2 = null ; // 声明per2对象
per1 = new Person() ; // 只实例化per1一个对象
per2 = per1 ; // 把per1的堆内存空间使用权给per2
per1.name = "张三" ; // 设置per1中的name属性内容
per1.age = 30 ; // 设置per1中的age属性内容
// 设置per2对象的内容,实际上就是设置per1对象的内容
per2.age = 33 ; // 设置per2中的age属性内容
System.out.print("per1对象中的内容 --> ") ;
per1.tell() ; // 调用类中的方法
System.out.print("per2对象中的内容 --> ") ;
per2.tell() ; // 调用类中的方法
}
};
per2=per1,并没有通过new来实例化对象,而是通过引用,和per1指向了相同的堆内存空间,内存分析:
class Person{
String name ; // 声明姓名属性
int age ; // 声明年龄属性
public void tell(){ // 取得信息
System.out.println("姓名:" + name + ",年龄:" + age) ;
}
};
public class ClassDemo06{
public static void main(String args[]){
Person per1 = null ; // 声明per1对象
Person per2 = null ; // 声明per2对象
per1 = new Person() ; // 实例化per1对象
per2 = new Person() ; // 实例化per2对象
per1.name = "张三" ; // 设置per1中的name属性内容
per1.age = 30 ; // 设置per1中的age属性内容
per2.name = "李四" ;
per2.age = 33 ; // 设置per2中的age属性内容
per2 = per1 ; // 把per1的堆内存空间使用权给per2
System.out.print("per1对象中的内容 --> ") ;
per1.tell() ; // 调用类中的方法
System.out.print("per2对象中的内容 --> ") ;
per2.tell() ; // 调用类中的方法
}
};
对于以上代码内存分析:
per2,这个堆内存,没有了栈内存的指向,就被认为是垃圾了,就会被Java内存收集机制GC,所回收掉。
以上图片来自他人,在此拿来使用,尊重版权。