java基础(初始化和清理)

一个java初始化的例子

运行结果

结论:执行main方法,必须加载test2类,然后静态域b和c被初始化,然后他们对应的类被加载,由于他们对应的类也包含静态A对象,所以A也被加载,所以在这个程序中,所有的类在main()开始之前就都被加载了。初始化的顺序是先静态对象,而后是非静态对象。静态初始化只有在类被初始化时才会创建,只有在第一次对象被初始化,或者第一次访问静态数据的时候,他们才被初始化,此后,静态对象不会再次被初始化。

疑问?

在看thinking in java 第四版189页中提到“即使没有显示地使用static关键字,构造器实际上也是静态方法”这句话产生了疑问,如果构造器是静态的话,那么里面的字段和方法也必须是静态的了,但是实际使用过程中并不是这样。对于这个疑问,网上查阅资料,这可能是作者的一个小错误。贴上具体博客地址 https://blog.csdn.net/bluetjs/article/details/52598635 。附上一段代码验证:

摘抄一段解释:

-------------------------------------------------------------------------------------------------------------

java语言规范里有这么一句话

Constructor declarations are not members. They are never inherited and therefore are not subject to hiding or overriding.

实例构造器无法被隐藏或覆写,不参与多态,因而可以做静态绑定。从这个意义上可以认为实例构造器是“静态”的,但这种用法与Java语言定义的“静态方法”是两码事

--------------------------------------------------------------------------------------------------------------

疑问结束

java的初始化顺序,贴上一段代码

父类:

子类:

主方法:

运行结果:

在没有把初始化的顺序了解透彻的话很容易会理所当然的理解为先执行父类的静态代码块再执行父类的代码块,然后再执行子类的静态代码块再执行子类的代码块,在第一次看到这个程序的时候我也犯了同样的错误,并且在执行父类初始化的时候调用的show方法理所当然的认为是调用了父类的show方法,其实初始化的是子类的对象,调用的是被子类重写的show方法。

得出结论,初始化的顺序:

父类静态变量、 父类静态初始块 (它们的在类中的顺序就决定了它们的初始化顺序,而不是变量一定会优先于初始块)> 子类静态变量 、子类静态初始块 > 父类成员变量 、父类非静态初始块(顺序执行,debug下看到不在代码块中输入成员变量,没有执行到成员变量初始化时,成员变量为null) > 父类构造器 > 子类成员变量 、 子类非静态初始块 (顺序执行)> 子类构造器

清理:

JAVA垃圾回收器负责回收无用对象占据的内存资源。垃圾回收器只释放那些由new分配的内存。

1.对象可能不被垃圾回收

2.垃圾回收至于内存相关

原文地址:https://www.cnblogs.com/xiayq/p/10328306.html

时间: 2024-10-11 13:10:43

java基础(初始化和清理)的相关文章

java的初始化与清理

this关键字 <think in java>: this关键字只能在方法内部使用,表示对"调用该方法的那个对象"的引用. 通常写this的时候,都是指这个对象或当前对象. 用法 1.区分同名变量 2.返回自身类的引用 3.在当前类的一个构造函数当中调用另一个构造函数 代码 public class User { int a; User(){ this(0); //区分同名变量 } User(int a){ this.a = a; //在构造方法中调用构造方法 } publ

Chapter5_初始化与清理_用构造器初始化

接下来进入第五章,java中初始化和清理的问题,这是两个涉及安全的重要命题.初始化的功能主要是为库中的构件(或者说类中的域)初始化一些值,清理的功能主要是清除程序中不再被需要的元素,防止资源过分被垃圾占用的出现,为解决这些问题,java中提供了对构造器和垃圾清理器的支持,首先讨论构造器的问题. 为了保证程序的安全性,java中采用了构造器的机制来保证初始化.第一个问题就是命名的问题,java中的构造器规定名称必须和类名相同.这主要是出于如下的考虑,第一如果让编程者自行命名,则可能会产生于其他任何

图解 & 深入浅出Java初始化与清理:构造器必知必会

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 在面向对象编程中,编程人员应该在意"资源".比如 ? 1 <font color="#000000">String hello = "hello": </font> 在代码中,我们很在意在内存中Stri

Java编程思想(二) —— 初始化与清理

(一)操作符一章的int类型数据溢出的问题在Java7的版本中仍然存在,而且溢出的结果千奇百怪. public class Hello { public static void main(String[] args) { int i = Integer.MAX_VALUE; System.out.println(i); System.out.println(i*4); System.out.println(i*5); } } 结果分别为2147483647,-4,2147483643. 当应用中

《 Java 编程思想》CH05 初始化与清理

< Java 编程思想>CH05 初始化与清理 用构造器确保初始化 在 Java 中,通过提供构造器,类的设计者可确保每个对象都会得到初始化.Java 会保证初始化的进行.构造器采用与类相同的名称. 由于构造器的名称必须与类名完全相同,所以"每个方法首字母小写"的风格在这里不适用. 构造器方法可以有参数,这样可以在初始化对象时提供实际参数. 不接受任何参数的构造器叫做"默认构造器". 构造器一种特殊类型的方法,它没有返回值 方法重载 因为可以要用多种方式

[Think In Java]基础拾遗1 - 对象初始化、垃圾回收器、继承、组合、代理、接口、抽象类

目录 第一章 对象导论第二章 一切都是对象第三章 操作符第四章 控制执行流程第五章 初始化与清理第六章 访问权限控制第七章 复用类第九章 接口 第一章 对象导论 1. 对象的数据位于何处? 有两种方式在内存中存放对象: (1)为了追求最大的执行速度,对象的存储空间和生命周期可以在编写程序时确定,这可以通过将对象置于堆栈或者静态存储区域内来实现.这种方式牺牲了灵活性. (2)在被称为堆的内存池中动态地创建对象.在这种方式,知道运行时才知道对象需要多少对象,它们的生命周期如何,以及它们的具体类型.

Java 编程思想 第五章 ----初始化与清理(1)

从今天开始每天一小时的java 编程思想的阅读和编码,其实就是把书上的代码抄下来. 5.5 清理:终结处理和垃圾回收 初始化和清理工作同等重要,但是清理工作却被常常忘记,但是在使用对象之后,对对象弃之不顾的做法并不是很安全.Java有自己的垃圾回收器负责回收无用的对象占据的内存资源.但也有特殊情况:假定你的内存区域不是用new获得的,这是无法用垃圾回收器释放所以java中允许在类中定义一个名为 finalize()的方法.       工作原理: 一旦垃圾回收器准备好释放对象占用的存储空间,将首

Thinking In Java笔记(第五章 初始化与清理(三))

第五章 初始化与清理 5.6 成员初始化 Java尽力保证:所有变量在使用前都能得到恰当的初始化.对于方法的局部变量,Java以编译错误的形式来保证.如下: void f() { int i; i++; //Error:i not initialized } 会得到一条错误的消息,提示i可能没有初始化.编译器可以给i赋初值,但是并没有这么做,因为没有初始化是程序员的疏忽,为了保证程序的稳定性,能帮助程序员找出程序的缺陷所在. 但如果是类的数据成员是基本类型,类的每个基本类型成员变量都会保证有一个

Java编程思想:第5章 初始化与清理

随着计算机革命的发展,“不安全”的编程方式已经逐渐成为编程代价高昂的主因之一. 初始化和清理,正是涉及安全的俩个问题. 5.1 用构造器确保初始化 构造器名与类名相同,没有返回值 5.2 方法重载 构造器的重载与方法重载 5.2.1 区分重载的方法 参数列表的不同(不同顺序也是重载,但不建议这么做) 5.2.2 涉及基本类型的重载 void print(char c){System.out.println("The character is "+c); }    void print(