Java中对象的初始化和回收

20、Java编程中的对象清理、垃圾回收与初始化机制解析 本文详细解析了Java编程中对象清理、垃圾回收与初始化机制。内容涵盖终结器`finalize()`的作用与局限性、垃圾回收的不同算法(引用计数法、停止-复制算法、标记-清除算法)、Java堆内存分配与回收流程、类成员的初始化规则(包括局部变量、基本类型成员、对象引用的初始化)、构造函数与静态块初始化顺序、以及初始化机制在多线程环境和实际应用中的影响。同时,还讨论了初始化过程中的异常处理和性能考量,并提供了实际应用建议和未来发展趋势展望。适合Java开发者深入理解底层机制并优化程序性能。 阅读详情

对象初始化

构造方法

<span style="font-size:18px;">package com.cloud.day1;
/**
 * 对象的初始化
 * 1.编译器调用构造器
 * 2.构造器和类名相同
 * 3.初始化期间自动调用构造器
 */
class Test{
   /*无参构造器*/
   public Test(){
      System.out.println("初始化期间自动调用构造器");
   }
   /*带参构造器*/
   public Test(int t){
      System.out.println("有参构造器:"+t);
   }
}
public class Demo1 {
   public static void main(String[] args) {
      /*Java中对象初始化和创建是在一起执行的*/
      for(int i=0;i<5;i++){
        /*每次初始化期间都调用构造器,给对象分配存储空间*/
        new Test();
        new Test(i);
      }
   }
}</span>

方法重载

创建对象,会给这个对象所存储的空间取了一个名字,方法是给某个对象动作取的名字。

构造器:方法名相同而形式参数不同,用来初始化一些常用对象信息。

重载的方法必须有独一无二的形参列表,参数顺序和类型都可以用来区分方法的不同信息。

<span style="font-size:18px;">package com.cloud.day1;
class DogTest{
   String name;
   /*有参数和无参数的构造器*/
   public DogTest(){
      name = "小白1";
      System.out.println("初始化一条小白.."+name);
   }
   public DogTest(String name){
      this.name = name;
      System.out.println("自己给小狗取名.."+name);
   }
   /*根据方法中形参的不同进行方法重载*/
   public void info(){
      System.out.println("小狗会汪汪叫..");
   }
   public void info(String what){
      System.out.println(name+"小狗会:"+what);
   }
   public void info(int age){
      System.out.println(name+"小狗:"+age+"岁..");
   }
}
public class Demo2 {
   public static void main(String[] args) {
      DogTest dt = new DogTest("哈士奇");
      dt.info("看家..");
      dt.info(6);
   }
}</span>

基本类型方法重载 

基本类型存在一个自动转换的信息,在当做方法的形式参数时需要特别的注意。

 

返回值区分重载:这种方式会报错

<span style="font-size:18px;">public void getI(){
		System.out.println("I=2");
}
public int getI(){
		return 1l;
}</span>

构造器

这里就说一点:无参构造器就是默认构造器

<span style="font-size:18px;">package com.cloud.day1;
public class Demo3 {
   public static void main(String[] args) {
      new TestCon1();
      //如果TestCon2不声明无参构造器这里就会报错
      new TestCon2();
      new TestCon2(2);
   }
}
class TestCon1{
   public TestCon1(){
      System.out.println("无参构造器!");
   }
}
/**  
 * @ClassName: TestCon2
 * @Description: 这里很明确验证了无参构造器就是默认构造器
 * @author午_夜
 * @date 2016-8-10 下午5:55:25
 */
class TestCon2{
   public TestCon2(){
      System.out.println("无参构造器!");
   }
   public TestCon2(int i){
      System.out.println("有参构造器!"+i);
   }
}
 </span>

this关键字

this代表调用方法的那个对象的引用。

<span style="font-size:18px;">package com.cloud.day1;
public class Demo4 {
   int i = 1;
   public Demo4 add(){
      System.out.println(++i);
      //很明显这里返回this就代表了Demo4的对象
      return this;
   }
   public static void main(String[] args) {
      Demo4 dm = new Demo4();
      System.out.println("调用方法的对象:"+dm.add().getClass().getName());
      /*既然每次都返回的都是对象就可以连续的调用*/
      dm.add().add().add().add();
   }
}
</span>

this在构造方法中的使用

<span style="font-size:18px;">package com.cloud.day1;
public class Demo5 {
   public static void main(String[] args) {
      Cat cat = new Cat();
      System.out.println(cat.getCat().getClass().getName());
   }
}
class Dog{
   static Cat getCat(Cat cat){
      return cat;
   }
}
class Cat{
   Cat getCat(){
      /*this代表调用getCat的对象引用,那么就是Cat对象*/
      return Dog.getCat(this);
   }
}</span>

初始化

直接使用没有初始化的变量

<span style="font-size:18px;">void add(){
      /*这里声明一个int类型的变量,但是没有初始化*/
      int i;
      /*这里操作一个没有初始化的变量,编译器编译时直接报错*/
      //++;
}</span>

常见类型初始化

<span style="font-size:18px;">package com.cloud.day1;
public class Demo7 {
   public static void main(String[] args) {
 
   }
}
/**  
 * @ClassName: InitValue1
 * @Description: 基本数据类型初始化
 * @author午_夜
 * @date 2016-8-11 下午6:14:44
 */
class InitValue1{
   boolean b = true;
   int i = 2;
   long lg = 1;
   byte bt= 55;
   float f = 3.14f;
}
/**  
 * @ClassName: InitValue1
 * @Description: 引用类型初始化
 * @author午_夜
 * @date 2016-8-11 下午6:18:46
 */
class InitValue2{
   InitValue1 iv = new InitValue1();
   /*使用一个方法提供初始值,但是只有这个方法被执行之后才有初始值*/
   int i = f();
   int f(){return 11;}
}
</span>

构造器初始化

<span style="font-size:18px;">package com.cloud.day1;
public class Demo8 {
   public static void main(String[] args) {
      Constr cs = new Constr();
      /* 这里这样输出就会报错
      int i;
      System.out.println(i);
      */
   }
}
class Constr{
   public int i;
   public Constr(){
      /*i=0*/
      System.out.println("1.---"+i);
      i = 3;
      /*i=3*/
      System.out.println("2.---"+i);
   }
}
</span>

初始化顺序

在类的内部,变量定义的先后顺序决定了初始化的先后顺序。

<span style="font-size:18px;">package com.cloud.day1;
public class Demo9 {
   public static void main(String[] args) {
      House hs = new House();
      hs.ff();
   }
}
class Window{
   public Window(int i){
      System.out.println("Window:"+i);
   }
}
class House{
   Window w1 = new Window(11);
   public House(){
      System.out.println("House()");
      w3 = new Window(33);
   }
   Window w2 = new Window(22);
   public void ff(){
      System.out.println("ff()");
   }
   Window w3 = new Window(3);
}
</span>

静态数据初始化

无论创建多少个对象,静态存储数据只占有一份内存空间,static关键字不能使用于局部变量,如果一个静态域存放是基本数据类型,而且没有进行初始化,那么它们就是基本类型的标准初值,如果是引用类型没有初始化,那么就是null。

<span style="font-size:18px;">package com.cloud.day2;
public class Demo1 {
   public static void main(String[] args) {
      Test2 te = new Test2();
   }
}
class Test1{
   Test1(int t1){
      System.out.println("Test1:"+t1);
   }
   public void test1f(int f){
      System.out.println("fff:"+f);
   }
}
class Test2{
   static Test1 t1 = new Test1(1);
   public Test2(){
      System.out.println("Test2");
      t2.test1f(222);
   }
   public void test2f(){}
   static Test1 t2 = new Test1(2);
}
</span>

静态代码块

和静态变量一样,静态代码块也是在首次访问类的时候被加载。

<span style="font-size:18px;">package com.cloud.day2;
public class Demo1 {
   public static void main(String[] args) {
      Test2 te = new Test2();
   }
}
class Test1{
   Test1(int t1){
      System.out.println("Test1:"+t1);
   }
   public void test1f(int f){
      System.out.println("fff:"+f);
   }
}
class Test2{
   static Test1 t1;
   static Test1 t2;
   static {
      t1 = new Test1(11);
      t2 = new Test1(22);
   }
   public Test2(){
      System.out.println("Test2初始化");
   }
}
</span>

非静态初始化

<span style="font-size:18px;">package com.cloud.day2;
public class Demo1 {
   public static void main(String[] args) {
      Test2 te1 = new Test2();
      Test2 te2 = new Test2(222);
   }
}
class Test1{
   Test1(int t1){
      System.out.println("Test1:"+t1);
   }
   public void test1f(int f){
      System.out.println("fff:"+f);
   }
}
class Test2{
   Test1 t1;
   Test1 t2;
   /*每次实例化这个类的时候,这个代码块都会被加载,这是和静态代码块的区别*/
   {
      t1 = new Test1(11);
      t2 = new Test1(22);
      System.out.println("代码块!");
   }
   public Test2(){
      System.out.println("Test2初始化");
   }
   public Test2(int i){
      System.out.println("Test2初始化"+i);
   }
}
</span>

数组初始化

数组是具有相同类型,使用同一个标识符封装到一起的一个对象序列或者基本类型的数据序列。数组是引用类型,数组之间的相互赋值就是在复制引用。

<span style="font-size:18px;">package com.cloud.day2;
public class Demo1 {
   public static void main(String[] args) {
      int[] a1 = {1,2,3};
      int[] a2 ;
      a2 = a1;
      for(int i = 0;i<a2.length;i++){
        a2[i] = a2[i]+1;
      }
      for(int j = 0;j<a1.length;j++){
        System.out.println("a1["+j+"]="+a1[j]);
      }
   }
}
</span>

可变参数列表

<span style="font-size:18px;">public class Demo1 {
   static void printArray(Object[] args){
      for(Object obj:args){
        System.out.println(obj+"");
      }
   }
   public static void main(String[] args) {
      printArray(new Object[]{"11","22","33"});
   }
}</span>

Java中垃圾回收机制

什么是垃圾回收

对象所占的内存在程序结束运行之前一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾。JVM的一个系统级线程会自动释放该内存块。垃圾回收意味着程序不再需要的对象是"无用信息",这些信息将被丢弃。当一个对象不再被引用的时候,内存回收它占领的空间,以便空间被后来的新对象使用。

Java垃圾回收器

java存在一个垃圾回收器,监视所有使用new创建的对象,并判断哪些是不再被引用的对象,随后释放内存空间,这样很好的解决了编程的内存泄露问题。

<span style="font-size:18px;">public class Demo1 { 
    public static void main(String[] args) { 
        //这里创建一个引用,并且初始化 
        String s = "Hello"; 
        //创建一个引用并且使用new关联对象 
        String s1 = new String("MyString"); 
        String s2 = new String("YourString"); 
        //这里修改s2的引用的指向地址,指向s1引用指向的对象地址 
        //程序运行到这里就会产生一个垃圾对象"YourString" 
        //jvm启动垃圾回收时,就会回收该垃圾对象,释放空间 
        s2 = s1; 
        System.out.println("s1:"+s1); 
        System.out.println("s2:"+s2); 
        /**输出结果
         * s1:MyString
         * s2:MyString
         */ 
    } 
}</span>
Java对象初始化与垃圾回收机制详解 本文深入探讨了Java中对象的初始化过程,包括类的静态和实例初始化器的作用,以及对象的构造顺序。同时,解析了Java垃圾回收机制,包括自动垃圾收集的工作原理,对象终结化过程以及垃圾回收对性能的影响。 阅读详情

相关推荐

深入理解Java对象初始化与垃圾回收机制

本文详细探讨了Java对象初始化过程中的类和接口初始化规则,以及构造函数调用顺序。通过实例分析了父类与子类初始化顺序、静态初始化块、实例初始化块的执行机制。同时,对Java垃圾回收机制进行了解读,包括自动垃圾回收的工作原理、对象终结和链式处理。最后,对java.lang包中的Object类和基本包装类进行了介绍,包括Object类提供的通用工具方法,如hashCode、equals、getClass、clone、toString等。

weixin_35509395的博客 343

Java对象回收

垃圾收集器在对堆进行回收前,第一件事就是要确定这些对象之中哪些还“存活”,哪些已经“死去”。

KEEP CODING 1401

用Python玩转共现分析:从NLTK到热力图可视化(附完整代码)

本文详细介绍了如何使用Python进行文本共现分析,从NLTK基础文本处理到构建共现矩阵,并实现热力图可视化。通过完整的代码示例,帮助数据分析师和开发者掌握这一揭示词语间关联网络的实用NLP技术,快速从文本中提取语义关系和主题结构。

weixin_29313817的博客 349

Java对象分配及垃圾回收机制

上一篇我们学习了JVM相关的一些基础概念深入理解Java虚拟机,这一篇我们重点来学习下Java对象相关的知识;

故不积跬步无以至千里 1086

OpenHarmony v4.1 Release设置应用随系统自动启动

OpenHarmony 4.1 版本中的 Ability Manager Service (AMS) 提供了应用自启动管理功能,允许系统控制哪些应用可以在系统启动时自动运行。这需要以下两个主要步骤:启用系统的自启动管理支持开发一个系统应用来管理自启动配置。

afufufufu的博客 1899

HC32F460的GPIO重映射实战:如何用3步搞定SPI引脚冲突问题

本文详细介绍了HC32F460的GPIO重映射功能,通过三步操作解决SPI引脚冲突问题。文章解析了HC32F460的FuncGroup功能分组机制,提供了具体的寄存器配置步骤和验证技巧,并对比了与传统方案的性能优势,帮助工程师灵活配置引脚,优化硬件设计。

t4y5u6i7o的博客 918

java对象的回收算法

分代回收算法将对象分为多个代,根据对象的生命周期不同,选择不同的算法来进行垃圾回收。通常将新生成的对象放在第一代中,再将存活了一段时间的对象放在第二代或第三代中进行回收,以减少整个垃圾回收的时间。它首先标记所有存活的对象,然后将所有存活的对象移动到内存的一段,将未被标记的对象都清除掉,以达到压缩内存的效果,减少了内存碎片的问题。标记清除算法通过标记所有可达对象,再清除所有未被标记的对象来实现垃圾回收。总之,Java对象的回收算法有多种实现方式,每种方式都有其优缺点,需要根据具体情况选择合适的回收算法。

ThinkPet 816

使用MKL+Eigen求解稀疏矩阵方程组

问题:求解Ax=b的解,其中,A为大型稀疏矩阵,长和宽分别为1500^2。 一般思路: (1)A为对称正定矩阵,对A使用cholesky分解。 (2)A为对称不定矩阵,使用LDL‘分解,即: PAP'=LDL' 其中,L为单位下三角矩阵,D由阶数为1或者2的对角块构成,P是置换矩阵。 (3)不对称矩阵:LU分解。 (4)长方形矩阵(长...

薛晓伟 3445

java回收无用的类对象使用关键字_JAVA,判断题

一个Java类可以有多个父类。break语句可以用在循环和switch语句中。Java小程序Applet的主类的父类必须是类Applet。可以用new来创建一个类的实例,即对象。Java使用16位的Unicode字符集...一个Java类可以有多个父类。break语句可以用在循环和switch语句中。Java小程序Applet的主类的父类必须是类Applet。可以用new来创建一个类的实例,即对象...

weixin_29139581的博客 7977

【全覆盖算法】栅格地图实现布氏单元分解算法+栅格地图实现牛耕Boustrophedon Cellular Decomposition Path Planning

本文先对做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容。

qq_35635374的博客 282

高通平台N4单路输入的720P相机预览

N4的一路720P Camera作为MIPI摄像头使用

llw21680的专栏 165

Java面试题及解析(判断题)

1.代码差错,判断代码对错,并指出错误处abstract class Name{ private String name; public abstract Boolean isStupidName(String name){} } 答案:抽象类中的抽象方法不可实现。即抽象方法后无花括号{}。 Public class Something{ Void doSomething(){

爱是与世界平行 9110

实现边缘实时动物检测:YOLOv5模型优化与树莓派4B部署全攻略

本文介绍了基于高性能计算机训练YOLOv5目标检测模型,并部署到树莓派4B实现实时动物检测的全流程。主要内容包括:1)在高性能计算机上通过Anaconda创建虚拟环境,安装YOLOv5项目并进行模型训练;2)将训练好的best.pt模型迁移到树莓派,配置轻量级Miniconda环境;3)连接树莓派摄像头,运行实时检测程序。该系统兼顾了训练效率和边缘设备部署的实用性,可广泛应用于智慧农业、生态监测等场景。文中详细说明了数据准备、环境配置和部署步骤,为开发轻量级目标检测系统提供了完整参考方案。

m0_64661770的博客 201

java学习笔记4--对象的初始化与回收

本文地址:http://www.cnblogs.com/archimedes/p/java-study-note4.html,转载请注明源地址。 1、对象初始化和回收 对象初始化 系统在生成对象时,会为对象分配内存空间,并自动调用构造方法对实例变量进行初始化 对象回收 对象不再使用时,系统会调用垃圾回收程序将其占用的内存回收 构造方法 一种和类同名的特

GarfieldEr007的专栏 1262

VictoriaMetrics | 云原生监控新宠: 使用 vmagent 工具采集 VM 集群指标实战

摘要:本文介绍了vmagent工具的安装部署及配置实践,该工具是VictoriaMetrics官方提供的指标采集组件,支持兼容Prometheus指标采集与转发。文章详细讲解了从二进制方式部署vmagent的步骤,包括下载安装、创建运行环境、配置systemd服务等过程。通过8429端口可查看采集状态,并演示了将Prometheus配置迁移到vmagent的方法。vmagent可实现远程写入VictoriaMetrics集群,为云原生监控提供高效解决方案。

全栈工程师修炼指南-IT知识分享 445

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java对象的初始化和回收

对象的初始化和回收         系统生成对象时,会自动为对象分配内存空间,并调用相应的构造函数对其初始化,在对象没有任何引用绑定时,垃圾回收器会周期行扫描内存情况并进行回收。 初始化         对象的生成和初始化是一体的概念,生成了对象就会对其初始化。Java提供了四种方法生成对象,使用new关键字仅仅是其中一种方法。         1. 使用new关键字生成对

hitpower的博客 1959

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java面向对象知识点总结01---构造器 初始化顺序 垃圾回收 初始化 重载 静态 static 数组初始化

构造器 初始化顺序 垃圾回收 初始化 重载 静态 数组初始化

Aa102365478的博客 482

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java读书笔记之垃圾回收、对象初始化

8、垃圾回收器的工作,与C\C++不同的是Java给对象分配空间时像是个传送带,直接往前塞他就一定时空的可以放下的,这样大大提升了速度,但是当垃圾对象被清理掉那些传送带上的空间就会出现间距,所以垃圾回收时垃圾回收器会将内存中的对象进行从新排序,让他变得更紧凑。1、面向对象编程的优点 封装集成多态 实现了高复用性,包括对象的组合和聚合 提高内聚 解耦,使研发者可以动态修改自己类中的值而不影响应用者,可以用对象来直接表示问题空间, 而不像面向过程般需要 直接在脑子建模面向机器的解空间。...

a1192900925的博客 268

9个Java对象的初始化和回收的面试题

Java的初始化和回收相关知识是公司在面试开发人员时常考察的问题,这里列出了8大常见的题型。 1.Java中是如何区分重载方法的? 通过重载方法的参数类型和顺序来进行区分的。 注意:若参数类型和顺序均相同时,不管参数名是否相同,编译器均会报错,提示方法已经被定义。且不能根据返回值类型来区分,如果根据返回值来区分的话,有时程序里调用方法时并不需要返回值,那么程序都无法确定该调用那个

请叫我大师兄 2688

Java_类的生命周期(类初始化、对象实例化、垃圾回收等理论知识结构)

完整版总结

Chill Lyn 392

9个java对象的初始化和回收的面试题

Java的初始化和回收相关知识是公司在面试开发人员时常考察的问题,这里列出了8大常见的题型。 1.Java中是如何区分重载方法的? 通过重载方法的参数类型和顺序来进行区分的。 注意:若参数类型和顺序均相同时,不管参数名是否相同,编译器均会报错,提示方法已经被定义。且不能根据返回值类型来区分,如果根据返回值来区分的话,有时程序里调用方法时并不需要返回值,那么程序

hitpower的博客 249

java变量存储、初始化、回收

1、保存到什么地方①寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配的。我们对此没有直接的控制权限,也不可能在自己的程序里找到寄存器存在的任何踪迹。② 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放哪些内存。这...

crazzy_lp的博客 283
上一篇: MySql软件安装图解
下一篇: 代理设计模式
午-夜
博客等级 码龄12年 95粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值