《Java编程思想》学习笔记04、初始化与清除

1、对象的创建与初始化是同一个概念,不能分离
2、构造函数名必须与类名完全相同,某种意义上讲,构造函数可以看成静态方法,它对于同一个类的每个对象都是一样的,且执行它的时候对象还未创建好
3、默认构造函数(default constructor)是无参数的,编译器将无参构造函数(可能是自己定义的)视为默认构造函数

[@more@]

4、构造函数可以有参数,一定没有返回值(与void型方法不是同样概念,void是编写者自行确定不返回任何值)
5、可以重载(overloading)构造函数
6、重载规则(适用于全部重载):每一个经过重载的方法都必须有唯一的参数类型的列表
7、new一个对象的时候,new表达式返回这个新创建对象的引用(reference)


8、创建对象是给一段内存空间起名字,方法是一个动作的名字,这都属于名字管理的范畴

9、实参,调用方法时赋予的参数;形参,方法定义时所声明的参数

10、this关键字只能用于非static方法内部,注意是方法内部,不是类定义内部,this是对象引用的标识符,它指的是一个对象,用在类定义范围内是没有意义的,常被用于return语句以返回当前对象的reference

11、可以用this在一个构造函数中调用另一个构造函数,但只能调一个,稍微想想就明白了,一个对象不能被初始化两次,那构造函数显然也不能顺序执行两次

12、在非构造函数的方法中,不能调用任何构造函数


13、Java的垃圾回收机制只能回收用new分配的内存


14、finalize()方法,垃圾回收机制在释放对象索占用的内存的时候,会先调用finalize()方法,进行一下“临终关怀”,比如在此方法中释放非new分配的内存


15、C++中,对象总是会调用析构函数(destructor)来清理自身,但Java对象不总是会被回收,垃圾回收也不是析构(destruction)


16、垃圾回收器会不会启动,什么时候启动,都是无法确定的事,所以finalize()什么时候执行也无法确定,它们是靠不住的

17、System.gc()可以强制进行垃圾回收,也就是强制执行finalize()

18、finalize()还可以被用来检查对象的中止条件(termination condition),比如对象是一个打开的文件,则可以用finalize()检查它是否已经被关闭


19、finalize()是在非常特殊的场合才会用到的,比如:内存是以创建对象以外的形式被分配给对象的,即Java程序调用非Java程序,以native method来分配的内存,比如调用C或C++的malloc(),如果不在finalize()里调用free(),内存就不会被释放,会发生泄漏


20、C++对象如果以本地(local)形式创建(不用new),是创建在栈里的(delete对象时会调用析构函数来释放);Java不允许创建本地对象(local objects),必须用new,分配在堆里(堆比栈慢)

21、垃圾回收不仅仅是回收空间,还将对象重新排列紧凑,使得堆指针指向大块的未使用空间,提高分配新内存的速度

22、不同JVM对垃圾回收可能有不同实现机制,常见的有:停止——复制(stop-and-copy)、标记——清扫(mark-and-sweep)、以及在两种之间进行“自适应”

23、为某个类创建第一个对象时,装载器才装载该类,一般如此

24、装载一般采用lazy evaluation(惰性编译),编译器只在必要的时候才编译代码,这是现在JDK中Java HotSpot技术采用的方法,代码执行的次数越多,速度就越快

25、方法内定义的变量如果使用前未初始化,将会有编译时错误,类的成员变量或对象的引用如果未初始化,Java会给予默认初值,其中引用的默认初值为null,此时如果要使用这个引用,将会出现运行时错误,即NullPointException

26、编译器对类成员变量的赋初值是在构造函数之前执行的,无论成员变量在类定义体的什么位置,在类内部,变量定义的顺序决定了初始化的顺序

27、某类的第一个对象创建时的完整顺序是:
->分配空间
->存储空间清零(使用java默认值来初始化全部成员变量,对象中的所有基本类型数据被设置成默认值,引用设置成null)
->初始化静态成员变量(使用自定义的默认值)
->初始化非静态成员变量(使用自定义的默认值)
->执行构造函数

28、静态成员变量只有在第一次被访问或该类的第一个对象被创建时才被初始化,即,只在必要时刻(类被初次加载时)才被初始化,初始化后就不能更改了

29、可将对静态/非静态成员变量初始化的语句分别用{}围起来组成一个块(或叫做子句)

30、建议采用int[] a1;的形式来定义数组,但int a1[];也是合法的,java不允许指定数组大小

31、数组是对象序列,也可以看作是一种特殊对象,即使里面的元素是基本类型,数组也是对象,可以用int[] a = new int[20]来分配存储空间,也可以直接用a1 = a2;来赋值,注意用=赋值的时候只复制了引用

32、如果数组里的元素不是基本类型,则必须对每一个都new一次,才算每个元素都真正有了空间,否则还只是个引用数组

33、如果数组越界,编译不会有问题,但会产生运行时错误,即Exception

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9874732/viewspace-917400/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9874732/viewspace-917400/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值