`
Xiaor
  • 浏览: 53438 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

第五章 初始化与清理学习总结与疑问

阅读更多
1、构造器初始化
①在概念上,“创建”和“初始化”是两回事,在java中,两者是捆绑在一起不可分割的。java提供了构造函数初始化对象,当用户有能力操作对象的方法之前,java编译器自动调用构造函数初始化对象。
②如果一个类中,用户没有定义任何构造函数,系统会自动分配一个默认构造函数(无参构造函数),但是,只要用户定义了至少一个构造函数,系统就不会再自动分配。
③在一个类中,一个构造函数可以调用另一个构造函数(不可以调用两个),但是不允许构造函数在其他方法中被调用。
④java中可以调用C和C++程序(本地方法)。
2、方法重载
①区分重载方法的依据:参数列表(个数,类型,顺序),但不能根据返回值区分。
②传入的数据类型小于方法中声明的形参类型时,会被自动提升,提升顺序为byte-short-int-long-float-double,但是char例外,它直接被提升为int。反之,必须显示进行类型转化,否则编译不通过。
3、清理:终结清理和垃圾回收
①如果程序运行期间不面临内存耗尽的情况,是不会调用垃圾回收器去进行垃圾回收的,因为这也是有开销的。
②垃圾回收器准备好回收某个对象时,先调用finalize方法,在下次回收的时候,才真正的将这个对象回收。
③finalize除了可以做一些清理工作外,如释放非new方式创建对象分配的空间。另外可以作为终结条件进行验证。
④垃圾回收器的模式有引用计数和另一种模式,这种模式的思想是,从堆栈或者静态存储区开始,遍历所有的引用,就可以找到活的对象,然后追踪该对象的所有引用,直至遍历了整个网,不在网内的对象即为死对象,基于这种模式的垃圾回收技术有停止-复制,标记-清除,他们都必须在程序停止的情况下可能进行。
⑤java中提供了JIT编译器提供速度,它负责把程序翻译成本地机器码,机器码要比字节码长的多。翻译时有两种方法:一次全部翻译完和惰性评估
4、成员初始化
①对于方法的局部变量,若未初始化就使用,编译是通不过的。
②类的成员变量会被自动赋值,而且是在构造函数赋值之前。这与成员变量的声明位置无关。
java中初始化顺序:显示静态变量,后是非静态变量,静态变量只被初始化一次,非静态变量会被初始化多次,当它所在的类new一个对象的时候,它就被初始化一次。
③对于类中的static{}程序块,同静态初始化一样只执行一次,当首次生成这个累的一个对象时,或者首次访问属于这个类的静态数据成员时(即使从未生成过
这个类的对象)。
5、数组初始化
①声明方式:int[] a;  int a[];
②int[] a1={1,2,3,4};//这种初始化方式只可以用在定义的地方
  int[] a2=a1;
  当a2改变时,a1也变。
③可变参数列表:数据类型可变,采用Object作为形参;
                数组作为形参:String[],或者String...(java SE5之后支持)
6、enum
①定义形式
public enum Types{T1,T2,T3,T4}
②使用形式
Types t= Types.T1;
③java为enum提供的方法有toString(),ordinal(),values()。
④enum可以用作switch的条件:
Types type;
switch(type){
case T1:  ...; break;
case T2:  ...; break;
...
}


求解:①一个类中,在定义时就被初始化了的String域,和通过构造器初始化的另一个String域,有什么差异?
②垃圾回收第二种模式中,为什么活的对象,一定能最终追溯到其存活在堆栈或者静态存储区中的引用?为什么位于这个网中的对象就是活的,而遍历不到的就是要回收的呢?



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics