`
从此醉
  • 浏览: 1073157 次
  • 性别: Icon_minigender_1
  • 来自: US
社区版块
存档分类
最新评论

[Java]初始化与清理

 
阅读更多

1. 构造器

初始化和清理是涉及安全的两个问题,许多C程序的错误都源于忘记初始化变量,当使用完一个元素时,也很容易忘记清理它。C++引入了构造器的概念,这是一个在创建对象时被自动调用的特殊方法,Java中也采用了构造器,并额外提供了垃圾回收器,对于不再使用的内存资源,垃圾回收器能自动将其释放。

在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。创建对象时,如果类具有构造器,就会自动调用相应的构造器。构造器采用与类相同的名称,也避免名称冲突的问题,例如:

 

class Test {
  Test() {
    System.out.print("Initialize");
  }
}
public class Constructor {
  public static void main(string[] args) {
    new Test();
  }
}

 现在在创建Test的对象时,将会为对象分配存储空间,并调用相应的构造器,这就确保在操作对象前已经被初始化。不接受任何参数的构造器叫默认构造器,它也能带有形式参数, 以便指定如何创建对象,例如:

 

 

class Test {
  Test(int i) {
    System.out.print("Initialize i");
  }
}
public class Constructor {
  public static void main(string[] args) {
    new Test(10);
  }
}

 有了构造器形式参数,就可以在初始化对象时提供实际参数。构造器是一种特殊类型的方法,它没有返回值(这与void不同),并且别无选择,如果没有定义任何构造器,编译器将会自动创建一个默认构造器。

 

2. 重载

大多数程序语句要求为每个方法提供一个独一无二的标识符,在Java里,构造器是强制重载方法名的另一个原因。如果需要创建一个类,可以用不同的方法初始化,这就需要多个构造器。由于它们都是构造器,所以必须有相同的名字,即类名。为了让方法名相同而形式参数不同的构造器同时存在,必须用到方法重载,它也可应用于其他方法,例如:

class Test {
  Test() {
    system.out.println("Defalut");
  }
  Test(int i) {
    system.out.println("Initialize i");
  }
}
public class Overloading {
  public static void main(String[] args) {
    new Test();
    new Test(10);
  }
}

 每个重载的方法必须有一个独一无二的参数类型列表,甚至参数顺序的不同,但是使用不同的返回值来区分是不可行的。此外,基本类型能从一个较小的类型自动提升至一个较大的类型,此过程一旦涉及重载,可能会造成一些混淆。

 

3. this

假如希望在方法的内部获得对当前对象的引用,有专门的关键字:this,它只能在方法内部使用,表示对调用方法的对象的引用,this的用法和其他对象引用相同,但如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可,例如:

class Test {
  void a() {return this;}
  void b() {a();}
}

 如果为类写了多个构造器,可以使用this在一个构造器中调用另一个构造器。在构造器中,如果为this添加了参数列表,那么将产生对符合此参数列表的某个构造器的明确调用,例如:

class Test {
  Test(int i) {}
  Test(String s) {
    this(10);
  }
}

 尽管可以用this调用一个构造器,但却不能同时调用两个,此外必须将构造器调用置于最起始处,否则编译器会报错。除构造器外,编译器禁止在任何方法中调用构造器。

static方法是没有this的方法,在static方法的内部不能调用非静态方法,这正是static方法的主要用途。

 

4. 垃圾回收

Java有垃圾回收器负责回收无用对象占据的内存资源。由于垃圾回收器只知道释放经由new分配的内存,所以它不知道如何释放并非使用new获得的特殊内存。

为了应对这种情况,Java允许在类中定义一个名为finalize()的方法,一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。这与C++中的析构函数有所不同,当程序员调用delete操作符时,就会调用相应的析构函数,而Java虚拟机如果并未面临内存耗尽的情形,它不会浪费时间去执行垃圾回收以恢复内存,这意味着finalize()并不保证一定会发生。

之所有要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非Java中的通常做法,这种情况主要发生在使用本地方法的情况下。本地方法是一种在Java中调用非Java代码的方式,目前只支持C和C++,在非Java代码中,也许会调用malloc()函数来分配存储空间,所以需要在finalize()中用本地方法调用free()来释放。

5. 初始化

Java尽力保证所有变量在使用前都能得到恰当的初始化。对于方法的局部变量,Java以编译时错误的形式来体现。如果类的数据成员是基本类型,那么它们都保证会有一个初始值,如果定义一个对象引用并且不将其初始化,此引用就会获得一个特殊值null,例如:

class Test {
  char c;
  int i;
  String s;
}

 可以通过调用某个方法来提供初始值,也可以带有参数,但这些参数必须是已经被初始化的,例如:

class Test {
  int i = a(10);
  int j = a(i);
  int a(int n) {return n;}
}

 静态数据成员的初始化只有在必要时才会进行。如果不创建类的对象,或不引用类的静态数据成员,那么静态数据成员永远都不会被初始化。初始化的顺序是先静态对象,而后是非静态对象。变量定义的先后顺序决定了初始化的顺序,但是不论它们定义在什么位置,都会在任何方法(包括构造器)被调用之前得到初始化。

Java允许将多个静态初始化动作组织成一个特殊的静态子句,它看起来像个方法,但实际只是一段跟在static关键字后面的代码,这段代码仅执行一次,例如:

class Test {
  static int i;
  static {
    i = 10;
  }
}
 
4
8
分享到:
评论

相关推荐

    java编程思想-初始化与清理

    java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...

    详解Java的初始化与清理

    Java的初始化与清理是编程过程中至关重要的环节,它关乎到程序的正确运行和资源的有效管理。本文将深入探讨Java中的初始化过程,包括对象的构造器初始化以及类成员的初始化顺序,同时也会涉及Java的垃圾回收机制,即...

    java初始化和清理

    Java初始化和清理是Java语言中非常重要的两个过程,它们确保了Java程序的正确运行和资源的有效管理。Java的初始化包括类的加载、连接和初始化三个过程,而清理则主要指垃圾回收机制。 首先,Java初始化的主要特性...

    初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt初始化和清理.ppt

    初始化和清理是编程中至关重要的概念,特别是在Java这样的高级编程语言中。本节主要讨论了Java中的构造器、成员初始化、对象创建过程、垃圾回收以及垃圾回收器的工作原理。 4.1 构造器 构造器是Java中用于初始化新...

    第五章 初始化与清理

    本章“第五章 初始化与清理”可能详细探讨了这两个重要概念,特别是在软件工程和系统设计中的应用。下面将根据标题和描述,结合常见的初始化与清理实践,来阐述相关知识点。 初始化是程序启动时执行的一系列操作,...

    Java编程思想初始化与清理PPT教案学习.pptx

    Java编程思想中的初始化与清理是编程过程中的关键环节,它涉及到类的实例化以及对象生命周期的管理。在Java中,构造器(Constructor)是确保对象初始化的重要工具。 1. **构造器确保初始化** - 构造器是与类同名的...

    Java编程思想第05章初始化与清理.ppt

    《Java编程思想》第五章主要讨论的是对象的初始化与清理,包括构造器的使用、方法重载以及默认构造器的概念。下面将详细阐述这些知识点。 ### 一、构造器确保初始化 1. **为什么要引入构造器**:在Java中,构造器...

    第4章 初始化和清理.ppt

    在Java程序设计中,初始化和清理是至关重要的概念,它们涉及到对象的生命周期管理和资源的有效利用。本章将探讨几个关键的方面,包括构造函数、函数重载、成员初始化以及垃圾回收机制。 首先,构造函数是Java中用于...

    《Java编程思想》学习笔记1(操作符、控制语句、对象、初始化与清理).doc

    ### Java编程思想学习笔记知识点...以上是《Java编程思想》学习笔记中关于操作符、控制语句、对象、初始化与清理等关键知识点的总结。通过理解这些基础概念和技术细节,可以更好地掌握 Java 编程的核心原理和技术实践。

    android studio初始化报错

    6. **清理与重建**:如果以上步骤未能解决问题,可以尝试清理并重新构建项目,或者删除项目中的`.idea`和`build`目录,然后重启Android Studio并重新导入项目。 7. **日志调试**:查看Logcat中的错误信息,这将提供...

    数据库初始化/清除/备份/恢复工具包

    本工具包专注于数据库的初始化、清除、备份与恢复功能,对于任何依赖于数据库的应用来说,这些都是核心的操作需求。以下是对这些关键知识点的详细阐述: 1. **数据库初始化**:数据库初始化是指在新安装或重新配置...

    Java编程思想?初始化与清理

    初始化  2.清理  1.初始化  虽然自己的Java基础还是比较良好的..但是在解读编程思想的时候还是发现了许多的细节问题自己并没有完全的掌握.既然是研磨,那么应该更加的细致.  i.构造方法的重载.  首先说明...

    Java数组初始化时内存分配情况解析.pdf

    3. 数组初始化与内存分配 数组初始化时,Java会为数组的所有元素分配内存,并根据初始化列表为每个元素赋予初始值。对于未初始化的数组,如`int[] b = new int[5];`,虽然在堆上分配了足够的空间,但元素的初始值...

    JEECG 3.6 MYSQL初始化问题

    **JEECG 3.6 MYSQL 初始化问题详解** JEECG是一款基于代码生成器的Java快速开发平台,它集成了大量的优秀开源项目,为开发者提供了一整套的企业级解决方案。在部署和使用JEECG 3.6的过程中,MySQL数据库的初始化是...

    java中对象创建、初始化、引用文.pdf

    在Java编程语言中,对象的创建、初始化以及引用的理解是至关重要的。首先,我们要明确对象、引用和堆栈(Stack)与堆(Heap)的区别。 1. **对象**:对象是Java中的核心概念,它是类的实例。在Java中,当我们使用`...

    基于Java的ejbCreate函数用于初始化一个EJB实例.zip

    本篇文章将深入探讨“ejbCreate”函数在EJB中的作用以及如何使用它来初始化EJB实例。 ejbCreate函数是EJB 2.x时代的传统生命周期方法之一,用于在Bean实例创建时进行初始化。在EJB 3.x及更高版本中,这种特定的...

    初始化pinpoint库

    初始化Pinpoint库主要涉及到的是对分布式应用性能监控系统Pinpoint的安装和配置,特别是与HBase数据库相关的操作。HBase是Apache的一个高可靠性、高性能、分布式的列式存储系统,常用于海量数据的存储,而Pinpoint则...

    Spring bean初始化及销毁你必须要掌握的回调方法.docx

    Bean的生命周期包括初始化、正常运行以及销毁三个阶段。在这些阶段,Spring允许开发者定义自定义的行为,以便在特定时刻执行必要的操作。下面将详细介绍如何通过不同方式定义Spring Bean的初始化和销毁回调方法。 *...

    Thinking in java4(中文高清版)-java的'圣经'

    4.4 Foreach语法 4.5 return 4.6 break和 continue 4.7 臭名昭著的“goto” 4.8 switch 4.9 总结 第5章 初始化与清理 5.1 用构造器确保初始化 5.2 方法重载 5.2.1 区分重载方法 5.2.2 涉及基本类型的重载 5.2.3 以...

    java课程资源第四章

    初始化和清理 操作符与控制程序流 初始化与清理 - 涉及程序安全 构造器使用与初始化 方法重载 this关键字 终结处理与垃圾回收 初始化:成员、构造器、数组

Global site tag (gtag.js) - Google Analytics