第五章-------初始化与清理

本文详细解析Java中变量初始化的过程及初始化的概念,通过实例展示如何在Java中实例化对象,并深入探讨Java的垃圾回收机制,解释如何通过签名识别不同构造方法,以及Java对象创建的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
		 * Thinking in java 第五章 初始化与清理
		 * 任何一门语言,初始化与清理,都是一件非常重要的事情,因为在我们的电脑中,
		 * 内存始终是最珍贵的,如果对变量(对象)的初始化和清理不处理好的话,则是非
		 * 常浪费内存,甚至会破坏内存中的其他数据,java的设计者,则是通过更好的机制
		 * 来确保我们在使用每个变量(对象)之前,都能保证变量(对象)被初始化,而这个机
		 * 制也之借鉴并改进了c++的语法,用构造方法,而我们首先必须得理解,什么是初始化
		 * 我拿出了我在学习C语言的时候对变量以及初始化的理解了.如下:
		 * 1、变量:在最开始的学习C语言的时候,大概我们最早接触的就是变量吧.
			比如: int i;
		这个i就是一个变量么?但是这个变量到底代表什么呢?该怎么用呢?
		其实i是只是一个变量名,所谓的变量不过是一个抽象的概念,就类似于我们日常生活中给
		一些'东西'取名字,比如给我们人类取名为'人',鸟类为'鸟',变量只是一个概念,能够取具体的
		代表某些我们向要表达的事物。
		而c语言的变量 也就是我们想在计算机的世界里想表达的事物,那又是什么事物呢?
		简单的说就是在c程序运行的过程中可能会发生变化的值,这个值的类型可以是数字,字符,一切我们想要表达的类型,
		而在c语言里又有哪些类型呢?我们不妨先数一下,有int、 char、short、float、double、long、struct、enum、
		union这些类型,(当然在C中大概只有这么多,其他语言中有其他方法扩展),因此变量类型也无非是这几种。
		我们言归正传,上面式子中的i是什么呢? -变量名 是int类型变量的一个变量名,我们上面说了变量是代表一类事物,
		那么变量名则是代表某一具体的值。意思就是这个变量名必然代表计算机内部的具体的一个值,至于这个值是多少,在初始化之前
		我们并不知道,那么接下来就涉及到初始化的概念,什么是初始化呢?一行代码是 int i=10; 这就是初始化,但是我们能不能更具体点呢?
		其实初始化这一概念 是来自容器这一说话的,当我们定义了一个变量的时候,我们肯定是想要这个变量完成我们想要完成的事情,就类似于我们
		买了一个水缸,我们的目的是装水,那么装水这一过程就是初始化,注意,初始化一定是一个过程,就如int i=10;在我们程序员来看,只是一行代码,但是在
		计算机内部实现(初始化过程)的时候却是很复杂的,因此我们很多时候是感觉不到这一过程的,只有当涉及到面向对象编程语言的时候才会真正理解什么是
		初始化,在这我也不说那么多,我们只需要知道,变量的初始化就是为变量赋予一个具体的值,上面的例子就是把具体值10赋予给了变量i。(后面不叫赋予了,
		c语言里有专门的术语叫赋值)
		下面回到java,其实变量的初始化相当复杂,只是底层封装了这些过程,都是JVM的事情,我们只关心结果,就是我们需要的对象是否
		已经初始化了,当我们通过构造方法来实例化一个对象的时候,JVM会去辨别是否存在相对应的构造器,如果存在,则会在堆内存中开辟
		一块空间,然后以哈希码的形式返回我们该内存空间的地址.
		这里我们以一个实例的调试,我们去看看,我们在实例化一个对象的时候,JVM究竟是怎么实现的.
		 */
		Demo0 demo = new Demo0();
		demo.setAge(20);
		demo.setName("felayman");
		System.out.println(demo);
		/**
		 * 上述的代码非常简单,就是实例化一个Demo0对象,在Demo0中只有两个属性age,name和复写了
		 * toString()方法,然后打印出来.然后我们通过在MyEclipse调试上述代码
		 * 程序会在实例化Demo0类对象的时候启动JVM去调用ClassLoader类中的Class方法将我们的完整
		 * 路径的类名加载进JVM中,然后会通过JNI来调用本地方法(操作系统的c函数库),将该类信息注册到操作系统
		 * ,然后会调用Object类的hashCode()方法,将本类加载到内存中的地址信息以哈希值的方式返回给我们,
		 * 整个实例化(初始化)就在后台,JVM替我们完成了,然后返回一个引用给我们作为访问对象的接口使用.
		 * 	有时候我们这样去理解也许更好,我们将每个类比作一个模板,就跟工厂生产线上的模具一样,我们会根据模具
		 * 去生产很多的产品,那么我们也会根据类整个模具来生产很多类,那么好,问题来了,我们生产线上往往同一款产品
		 * 也会有很多不同的模具,而java中的类模板也很类似,就由许多的重载的构造方法来充当对象的模具,我们会根据不同
		 * 的构造方法来创建我们需要的对象.而编译器是如何辨别我们使用的模具而进行对象的生产呢?答案是---签名(也叫)
		 * 参数类型(或者参数顺序或者返回值),而重载是OOP语言的最大特点之一.至于重载的详细介绍,会在后面的章节跟着
		 * 作者去深入了解.
		 * 我在整个章节中觉得最经典的就是下面这两句代码:
		 * 当我们创建两个不同的对象并去调用同一种方法的时候,我们如何去分辨呢?
		 * 如:
		 * User user1 = new User();
		 * User user2 = new User();
		 * user1.setName(22);
		 * user2.setName(23);
		 * 很多时候,我们觉得这样的写法每问题,但是刨根问底,这样写不是很好的理解,而下面的写法则更加直观
		 * User.setName(user1,22);
		 * User.setName(user2,23);
		 * 这样的写法,我们更加清楚的明白,其实在调用某一个方法的时候,实际上只是把引用当作参数传递给了某个类而已.
		 * 当我在书上看到这种写法的时候,我很欣喜,觉得这种写法更加优雅和清晰.
		 * 再学习的java的时候,我们总是被他所吹嘘的'一次编译,到处运行','垃圾回收机制'所吸引,因为在其他有的语言中
		 * 这两个问题是鸡肋,而这里我们跟着作者的思路去分析java中的'垃圾回收机制',作者在分析这个问题的时候,讲解的
		 * 十分深入,甚至讲起了JVM的垃圾回收机制的实现技术,其中的关键词有'自适应','停止-复制','标记-清扫','JIT'
		 * 当然我们暂时不需要去了解那么深奥的分体,因为实现它是需要深厚的功力,非常偏底层了,但是其大概就是通过某种算法,
		 * 在程序运行的时候,会自动扫描整个JVM工作的内存区间,观察那些经过new关键字创建出来的对象的状态,通过分析上下文
		 * 来判断该对象是否仍旧需要,如果需要,不清理,如果不需要,就会清理掉它.(实现原理依旧是跟C语言中的free函数一致
		 * 无非是移动指针).当然我只是以自己的思维方式来去理解这些问题,跟原作者有很大出入.
		 * 下面用书中的原话,来总结一个对象的创建过程,假设有个类型为Dog的类:
		 * 1.即使没有显示的使用static关键字,构造器实际上也是静态方法<Yinci当首次创建类型为Dog对象的时候,或者Dog
		 * 的静态方法/属性首次被访问的时候,java解释器必须查找类路径,以定位Dog.class文件
		 * 2.然后载入Dog.class,有关静态初始化的所有动作都会被执行,因此,静态初始化只是在首次加载类的时候进行一次.
		 * 3.当使用new Dog()创建对象的时候,首先将在堆内存为Dog对象分配足够的空间,
		 * 4.这块空间会被清零,这就将自动的将Dog对象中的所有基本类型数据都设置成横了默认值,
		 * 5.执行所有出现于字段定义处的初始化动作
		 * 6.执行构造器
		 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值