面向对象,引用传递

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,所回收掉。

这里写图片描述

以上图片来自他人,在此拿来使用,尊重版权。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值