java 初始化和清楚_Java 初始化与清理

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

1.用构造器确保初始化:

当我们通过new关键字来创建对象的时候,就是调用了构造方法。

java会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。

1.1java采用与C++相同的,构造器命名方式,即构造器方法名与类名相同。(方法名首字母小写不适用与构造器);

1.2构造器是一种特殊类型的方法,因此它没有返回值。

1.3默认构造器:不接收任何参数的构造器

2 方法重载:

同名不同参数,方法名相同而参数不同。

2.1区分重载的方法:每个重载的方法都必须有独一无二的参数类型。

2.2基本类型的重载:如果传入的数据类型小于方法中声明的形式参数类型,实际参数会被提示。

2.3为什么不能以返回值区分重载;

有时候你并不关心方法的返回值,你想要的是调用方法的效果,这是你会忽略返回值,说以有时候会调用 会以这种形式调用:f(),java将无法得到返回值的信息,进而无法确定方法,所以根据方法的返回值来区分重载是行不通的。

3.默认构造器:

默认构造器:不接收任何参数的构造器

如果我们没有创建任何构造器,编译器会自动帮我们创建一个默认构造器。如果创建了构造器,编译器就不会帮我们创建构造器。

4.this关键字:

当一个类具有多个对象的时候,那么在调用一个非静态的方法的时候,是如何知道是被对象a调用了呢?还是被对象b调用了呢?

解析:编译器做了一些幕后工作,它暗自把“所操作兑现过的引用”作为第一个参数传递给了对象所调用的方法。

既然是暗自操作,我们如何在方法中获得这个对象引用呢?

为此有个专门的关键字:this,this关键字只能在方法内部使用,表示对“调用这个方法的那个对象”的引用。

如果在方法内部调用同一个类的方法,就不必使用this,直接调用即可。this引用会自动用于同一类中的其他方法。

4.1 this关键字对于将当前对象船体给其他方法很有用。就是将this作为返回值,在程序中我们会看见通知的创建方法的连续调用,就是采用这种方法。

4.2当方法中的参数与成员参数,同名的时候,默认会调用方法中的参数,当我们想使用类中的参数,就需要在参数名前加入this., 表示对成员变量的引用。

4.3.在构造器中调用构造器:

this.(参数列表);直接调用对应参数的构造器。

4.3.1构造器的调用只能至于方法的最起始处。

4.3.2 一个构造器只能调用另外一个构造器。不能调用两个。

5.static的含义:

static方法就是没有this的方法,在static方法的内部是不能调用非静态方法。反过来倒是可以的。(这与类的加载先后有关系)

6.垃圾回收:

1. 对象可能不被垃圾回收,什么时候回收也不一定。

2.垃圾回收只于内存有关。(所以在输入输出流的时候选需要手动关闭)

6.1垃圾回收器是如何工作:

在创建了足够的对象后,内存的资源将耗尽。而java的垃圾回收器的工作是一面回收空间,一面使堆中哦对象紧凑排列。方便“堆指针进行内存分配”。

6.1其他系统中的垃圾回收机制:引用计数:

这是一种简单但是速度很慢的垃圾回收机制。每个对象都有一个引用计数器,当有引用连接至对象时,引用计数加1.当引用离开作用域或被置null,引用计数减1。虽然甘丽引用计数的开销不大,但这项开销在整个程序生命周期将持续发生。垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象引用计数为0时候,释放其占用的空间。(但是,引用计数模式经常会在计数值变为0的时候立刻释放对象)。这种方法游客缺陷:如果对象间具有循环引用。可能出现“对象应该被回收,但是引用计数却部位零”的情况。对于垃圾回收器而言,定位这样的交互子应用对象需要的工作两极大。

在一些更快地模式中,垃圾回收器并非基于引用记数,它地思想是:对任何“活”的对象,一定能追溯到起存活的在堆栈内存或者静态存储区之中地引用。这个引用链条可能会穿过数个对象层次。因此,如果从堆栈和静态存储区地开始,遍历所有地引用,就能找到所有获得对象。对于发现地每个引用,必须追溯它所指向的引用,然后是被指向对象所包含地所有引用,如此反复。直到“根源于堆栈和静态存储区的引用”所形成地网络全部被访问为止。你访问过得对象都必须是活的。这样就解决了“对象间相互引用”而导致对象无法回收地现象。因为这种情况根本不会被视为活地对象;解析:上面说了两种垃圾回收机制:原理都是当对象没有引用指向地时候就被视为垃圾,可以回收了。第一种采用对象引用计数的方式进行确定指向对象地引用地个数。

java虚拟机采用了一种自适应的垃圾回收计数。至于如何处理找到地存活地对象,取决于不同地java虚拟机。

java虚拟机地两种垃圾回收机制:

1.停止--复制

这意味着,先暂停程序地运行(所以它不属于后台回收模式),然后将所有存活的对象从当前堆复制到另一个堆,然后没有被复制地全部是垃圾。当对象被复制到新堆时,它们是一个挨着一个的。所有新堆保持紧凑排列,然后可以按加快内存地分配,加快了内存地分配速度。

当把一个对象搬运到另一处时,所有指向它的那些引用必须修正。位于栈内存和静态区域地引用可以直接被修正,但是在对象中地引用,他们在遍历地过程中才能被找到。(可以想想有个表格,将旧地址映射到新地址中)。

对于这种所谓地“复制式的回收器”而言,效率会降低,这有两个原因。首先需要两个堆然后得在两个分离地堆之前来回倒腾。从而得维护地空间比实际需要地就多一倍地空间。某些java虚拟机堆此问题地处理方式是,按需从堆内部分配成几个较大地内存,然后复制动作发生在这些大块内存之间。

2.标记-清扫

程序进入稳定状态后,可能只会产生少量垃圾,甚至没有垃圾。尽管如此,停止--复制回收器仍然会将所有内存(活地对象)自一处复制到另一处,这很浪费。(因为基本上都是需要移动地对象)。为了避免这种情况,一些java虚拟机会进行检查:要是没有新的垃圾产生,就会转换到另一种工作模式(自适应)。这种模式就是标记--清扫。一般情况下,标记--清扫方式速度很慢,只有在垃圾特别少或则不产生垃圾地时候就,这种方式运行地速度很快。

标记--清扫 所依据地思路同样是从堆栈和静态区域存储出发,遍历所有地引用。进而找出所有存货地对象,每当它找到一个存活地对象。就会给这个对象一个标记。这个过程不会回收任何对象。只有当全部标记完成的时候,清理动作才会开始。在清理过程中,没有标记地对象将被释放,不会发生复制动作。所以剩下地堆空间是不连续地。垃圾回收器要是希望得到连续地空间地话,就得重新整理剩下地对象。

自适应技术:java虚拟机会进行监视如果和所有对象都很稳定,垃圾回收地效率降低地话,就会切换到标记-清扫模式,同样,java虚拟机会跟踪标记--清扫地效果。要是堆空间出现很多碎片,就会切换到停止--复制方式。

7.成员初始化:

所有变量在使用前都能得到惬当地初始化。对于方法中地局部变量,java编译器是以编译器错误地形式来保证初始化。成员变量地初始化,具有默认初始化和指定初始化两个过程。

8.静态数据初始化:

无论创建多少个对象,静态数据都只占有一份存储区域。static不能应用于局部变量,只能作用于成员变量。如果一个静态成员没有被初始化,他就会获得默认值,引用为null,基本数据类型为默认值。

对象地创建与初始化过程:

1,当我采用new关键创建一个对象或者调用类的静态方法或则静态域地首次访问的时候。

2.java解释器必须查找路径,一定为.class文件。(java是如何查找.class文件?是如何生成.class文件的呢?后面会说到。..class根据后缀就只域class类有关系)

3.载入.class文件(这时候会生成一个class对象),关于静态初始化地所有动作都在这里进行。因此静态初始化只在Class对象地首次加载地时候进行一次。

4.以下地步骤会在new关键字创建对象地时候才会执行,如果是调用类的静态方法或则静态域地首次访问的时候地情况,以下地步骤并不会执行到。

5,当new关键字创建对象地时候,会在堆内存上为对象分配住够地空间。

6.这块存储空间会被清零,这就自动将Dog对象中的所有的基本类型数据都设置为默认值(对数字是0,对布尔类型是false),而对引用被设置成了null。

7.然后调用父类的构造方法。

8.然后对于需要指定初始化的数据,进行初始化。

9.执行构造器中的代码。

10.完成初始化。

在创建一个类使用之前要进行这些工作后,我们才可以使用这个对象

9.显示静态初始化

:将多个静态动作组织成一个特殊的“静态子句”有时也叫静态块。

静态块的写法:static{   i=9;f()  }

采用static关键字+大括号来进行。

静态块:中的代码执行与静态变量是一样的,会在类的首次加载的时候一次。在静态快中的方法也会被调用,被执行。

10 非静态实例初始化:与静态初始化类似,就是不需要进行用statci关键字修饰:

{  i=9;f()  },代码块中的代码会在创建每一个实例,调用父类构造器后执行。

11.数组是相同类型,用一个标识符封装到一起的一个对象序列或基本类型序列。

当我们创建一个数组就会被自动初始化。

12.可变参数列表:

可变参数列表是方法参数的一种声明方式,一个方法中只能声明一个,并且只能为参数列表的最后位置。

声明方式  open(String。。。 s);

使用方法,当调用方法的时候,可以传入0·n哥String对象,传入方式为open(“s”,“s”);

在方法内部将s视为字符串数组即可。

本章完毕  等要学服务端的时候在说说枚举

1-010101010

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值