Java(9)面向对象概念、对象内存分析、对象引用分析、引用传递与垃圾产生分析

面向对象概念

面向对象设计有三个主要的特征:

  • 封装性:内部的操作对外部而言不可见,当内部的操作都不可直接使用的时候才安全
  • 继承性:在已有结构的基础上继续进行功能的扩展
  • 多态性:在继承性的基础上扩充而来的概念,指的是类型的转换处理。

类是对每一类事物的共性抽象概念,而对象描述的是一个具体的产物。例如:现在我和某一位先生站在一起,可以立刻区分出我还有别人,因为我们各自有很多不同的特征,比如头发颜色不相同,衣服颜色不相同,眼睛大小不相同。通过这些可以区分,相比其他国家的人,我和哪位先生都有一个共性的标志:中国人。人和人之前的不同是依靠他们自身各种的属性,这些属性的集合就构成了一个对象,但是所有的属性都应该是群体的定义,而群体的定义就形成了一个类。类是一个模板,而对象才是类可以使用的实例,先有类再有对象。

在类之中一般有两部分组成:

  • 成员属性,比如姓名、年龄
  • 操作方法,比如唱歌、跳舞、跑步

对象内存分析

对象内存分析,是一个很简化版进行内存分析,是为了帮助我们快速了解对象创建过程。
常用的内存空间:

  • 堆内存:保存对象的基本信息,比如对象属性的name、age。注意,堆内存是由new关键字开辟的。
  • 栈内存:保存的是一块内存地址

声明并初始化对象内存分析

1.分析的代码

class Person{
    String name;
    int age;
    public void info(){
        System.out.println("name =" + name + " age = " + age);
    }
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "ike";
        person.age = 18;
        person.info();
    }
}

2.分析过程

1)程序在栈内存声明类型为Person的引用,名为person。person里存储的是内存地址。
2)程序执行到new关键字时,在堆内存开辟一块空间,内存地址是0x112233。
3)程序执行到Person();对开发的空间进行内容声明,声明name、age。因为这时并没有对name和age赋值,所以name、age是默认值。引用类型默认值是null,整形默认值是0
4) 程序将这块准备好的内存地址赋值给person
对象实例化流程截图
5)程序调用引用person为name赋值
对象实例化流程截图
6)程序调用引用person为age赋值
7)程序调用info方法执行。
8)程序结束
在这里插入图片描述

声明与实例化分步完成对象内存分析

通过分析声明和实例化对象分开,声明对象引用,这个时候它的默认值为null。也就是没有指向任何堆内存空间。

1.分析的代码

class Person{
    String name;
    int age;
    public void info(){
        System.out.println("name =" + name + " age = " + age);
    }
    public static void main(String[] args) {
        Person person;
        person = new Person();
        person.name = "ike";
        person.age = 18;
        person.info();
    }
}

2.分析过程

1)程序在栈内存声明类型为Person的引用,名为person。person里存储的是内存地址。这个时候person引用没有指向任何空间,所以为null
在这里插入图片描述
2)程序执行到new关键字时,在堆内存开辟一块空间,内存地址是0x112233。程序执行到Person();对开发的空间进行内容声明,声明name、age。因为这时并没有对name和age赋值,所以name、age是默认值。引用类型默认值是null,整形默认值是0。程序将这块准备好的内存地址赋值给person
在这里插入图片描述
3)程序调用引用person为name赋值
在这里插入图片描述
**4)程序调用引用person为age赋值
5)程序调用info方法执行。
6)程序结束
在这里插入图片描述

对象引用分析

通过引用分析,对于引用类型数据的传递实际上引用传递,引用传递的本质:同一块内存空间可以被不同的引用指向,也可以更换引用。

1.分析的代码

class Person{
    String name;
    int age;
    public void info(){
        System.out.println("name =" + name + " age = " + age);
    }
    public static void main(String[] args) {
        Person person = new Person();
        person.name = "ike";
        person.age = 18;
        person.info();
    }
}

引用传递与垃圾产生分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章