java的初始化与清理

随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一。

初始化和清理正是涉及安全的两个问题。

1.用构造器确保初始化

默认构造器(无参构造器):不接受任何参数的构造器

2.方法重载

1.区分重载方法

每个重载的方法都必须有一个独一无二的参数类型列表。

参数顺序的不同也足以区分两个方法。不过,一般情况下,别这么做,因为这会使代码难以维护。

2.涉及基本类型的重载

基本类型能从一个“较小”的类型自动提升至一个“较大”的类型,此过程一旦牵涉到重载,可能会造成一些混淆。

如果传入的数据类型(实际参数类型)小于方法中声明的形式参数类型,实际数据就会被提升。char型略有不同,

如果无法找到恰好接受char参数的方法,就会把char直接提升至int型。

如果传入的实际参数较大,就得通过类型转换来执行窄化转换。如果不这样做,编译器就会报错。

3.以返回值区分重载方法

有时调用方法而忽略其返回值,所以根据返回值区分重载方法是行不通的。、

3.默认构造器

如果类中没有构造器,则编译器会自动帮你创建一个默认构造器。但是,如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。

4.this关键字

this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。

1.在构造器中调用构造器

在构造器中,如果为this添加了参数列表,那么就有了不同的含义。这将产生对符合此参数列表的某个构造器的明确调用。

尽管可以用this调用一个构造器,但却不能调用两个。此外,必须将构造器调用置于最起始处,否则编译器会报错。

2.static的含义

static方法(静态方法)就是没有this的方法。可以在没有创建任何对象的前提下,通过类本身调用static方法。具有全局函数的语义。

在static方法的内部不能调用非静态方法,但是在非静态方法中可以调用static方法。

5.清理:终结处理和垃圾回收

Java有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊的情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾

回收器只知道释放那些经由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。

它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生

时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。

注意:finalize()与C++中的析构函数不同:在C++中,对象一定会被销毁(如果程序中没有缺陷的话),而Java里的对象却并非总是被垃圾回收。

换句话说:1.对象可能不被垃圾回收  2.垃圾回收并不等于“析构”

只要程序没有濒临存储空间用完的那一刻,对象占用的空间就总也得不到释放。如果程序执行结束,并且垃圾回收器一直都没有释放你创建的任何

对象的存储空间,则随着程序的退出,那些资源也会全部交还给操作系统。这个策略是恰当的,因为垃圾回收本身也有开销,要是不使用它,那就不用

支付这部分开销了。

1.finalize()的用途何在

垃圾回收只与内存有关。使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于与垃圾回收有关的任何行为来说(尤其是finalize()方法),

它们也必须同内存及其回收有关。

finalize()作用:释放那些通过某种创建对象以外的方式为对象分配的存储空间。

之所以要有finalize(),是由于在分配内存时可能采用了类似C语言中的做法,而非Java中通常做法。这种情况主要发生在使用“本地方法”的情况下,本地

方法是一种在Java中调用非Java代码的方式。本地方法目前只支持C和C++,但C和C++可以调用其他语言写的代码,所以实际上可以调用任何代码。

时间: 2024-10-30 23:36:20

java的初始化与清理的相关文章

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

在面向对象编程中,编程人员应该在意"资源".比如 1 <font color="#000000">String hello = "hello": </font> 在代码中,我们很在意在内存中String类型的hello,它是有一个生命周期的.在它生命周期中,初始化(initialization)和清理(cleanup)是两个重要的环节.尤其是C程序中,很多bug会出现在对象初始化和清理的环节.这样会造成一些程序安全问题.

java规定初始化

如果想自己为变量赋予一个初始值,又会发生什么情况呢?为达到这个目的,一个最直接的做法是在类内部定义变量的同时也为其赋值(注意在C++里不能这样做,尽管C++的新手们总"想"这样做).在下面,Measurement类内部的字段定义已发生了变化,提供了初始值:   class Measurement { boolean b = true; char c = 'x'; byte B = 47; short s = 0xff; int i = 999; long l = 1; float f

java成员初始化

Java尽自己的全力保证所有变量都能在使用前得到正确的初始化.若被定义成相对于一个方法的"局部"变量,这一保证就通过编译期的出错提示表现出来.因此,如果使用下述代码: void f() { int i; i++; } 就会收到一条出错提示消息,告诉你i可能尚未初始化.当然,编译器也可为i赋予一个默认值,但它看起来更象一个程序员的失误,此时默认值反而会"帮倒忙".若强迫程序员提供一个初始值,就往往能够帮他/她纠出程序里的"臭虫". 然而,若将基本类

关于java类初始化顺序的问题

问题描述 关于java类初始化顺序的问题 正常来说一个类的初始化过程应该是: 1.全局静态变量 2.静态代码块 3.全局变量 4.代码块 5.构造器 有这么一个例子: public class LoadTest { //全局静态变量 static int staticI = 10; //全局变量 int i = 20; //构造器 private LoadTest() { System.out.println("staticI="+staticI); System.out.printl

java i o流 文本框-JAVA中初始化问题,代码在中的变量不能被初始化

问题描述 JAVA中初始化问题,代码在中的变量不能被初始化 我创建了一个按钮,给按钮一个鼠标监听器.按下按钮会获得一个文本区的字符串给masage,当我在其他包中调用getMasage方法,得到的字符串是123而不是文本区的字符串. import java.awt.Color;import java.awt.event.MouseEvent; import javax.swing.ImageIcon;import javax.swing.JButton;import javax.swing.JT

java quartz 初始化异常

问题描述 java quartz 初始化异常 2016-04-19 02:11:11,421 (QuartzScheduler.java:2425)-An error occured instantiating job to be executed. job= 'maxbet_job_group.isn_job_group' org.quartz.SchedulerException: Problem instantiating class 'com.thrash.job.DataJob' -

剖析一个java对象初始化顺序问题

今天我在Dzone阅读了一篇关于java对象实例初始化顺序的有趣文章.说它有趣,是因为作者使用了一种并不太推荐的编码风格,只有用这种编码风格才能触发这个极为少见的 Java object initialization order 问题. 其实java对象初始化顺序算是一个比较基础的java知识点.但是网上的文章多半描述不清,使用上一不小心就容易出问题. 所以在本文中,我想结合JLS和自己的理解,举例剖析问题的所在. OK,我们先来看个模仿Dzone作者原意的简单例子: [java] packag

Java变量初始化的时机

对于JAVA中变量的初始化是一个很基础的问题,其中的一些问题也是易被学习者所忽略.当在编写代码的时候碰到时,常被这些问题引发的错误,感觉莫名其妙.而且现在许多大公司的面试题,对于这方面的考查也是屡试不爽.以下是对java变量初始化的时机的分析. [java变量执行初始化的步骤] java是一门强类型语言,因此java语言规定每个变量必须先声明,然后才能使用,声明变量时必须指定该变量的数据类型.首先看下面这条语句的执行过程: int a = 5; 实际上面这条语句会被拆分成两个过程执行: (1)i

java基础-java对象初始化的问题

问题描述 java对象初始化的问题 java类中成员变量是自身对象的问题,可以知道如果这个成员变量是非static的,那么会出现stackOverflowError,即创建了一个A对象,A对象初始化时又会创建一个A对象,从而造成死循环,那么如果这个成员变量是static的,不会出现这个问题,但是运行结果我不是很懂,上代码: public class Test { public static void main(String[] args) { Person p=new Person("a&quo