当类中有多个构造器,在其中一个构造器内可用this()调用其他的构造器,但是只能调用一个,且要放到构造器内部开始处。
除构造器外,编译器禁止其他方法调用构造器(new除外)
static方法就是没有this的方法。static方法内部不能调用非静态方法(反过来可以)。
垃圾回收器只能释放经由new分配的内存。对于非new出来的对象获得的“特殊”内存区域它不知道如何释放。为解决这种情况,java允许类中定义名为finalize的方法。
finalize()的原理可被认为:一旦GC准备好释放对象占用的存储空间,将首先调用finalize方法,并在下一次垃圾回收发生时,才将回收对象占用的内存。
java垃圾回收:1、对象可能不被垃圾回收; 2、垃圾回收不等于析构; 3、垃圾回收只与内存有关。使用GC的唯一原因是回收程序不再使用内存。无论对象如何创建,GC都会负责释放对象占据的内存。
具体可以参考该博客: http://blog.youkuaiyun.com/u010746364/article/details/51555200
该博客中对于第二个结论的程序,若在 a.b = new B(); 后加上 B b= a.b; 则释放a,b的内存也不会释放。这就意味着只要对象有引用存在,对象内存就不会被GC回收。具体的解释需等我看完jvm的内容才能给出。
在编程中应该避免使用finalize,原因: http://blog.youkuaiyun.com/wuhenzhangxing/article/details/45559999
java不允许创建局部对象,必须使用new创建对象。
无论是垃圾回收或者终结,都不一定会发生。若jvm并未面临内存耗尽的情形,它便不会去执行垃圾回收以恢复内存。
System.gc()用于强制进行终结动作。p89的程序不太明白
GC对于提高对象创建速度有明显的作用。
无法阻止自动初始化的进行,它将在构造器被调整之前发生。
类内部变量定义先后顺序决定了初始化顺序,会在方法(包括构造器)被调用之前得到初始化。
无论创建多少对象,静态数据只占一份存储区域。static不能用于局部变量,构造器实际上是静态方法。静态初始化只在class对象首次加载时进行一次。
对象创建过程(以dog类为例):
1、首次创建dog对象,java解释器找出类路径,找到dog.class文件;
2、载入dog.class文件,进行静态初始化;
3、new dog()创建对象时,在堆上为对象分配足够的存储空间;
4、当该空间清零,意味将基本数据类型设置为默认值,引用设为null;
5、执行字段定义出的初始化动作;
6、执行构造器。
若类未加载,调用类的静态成员,将会对类的其他静态成员也进行调用(p97程序)
程序中的块相当于变量
数组越界是运行时错误,即异常。
toString方法默认打印类名加上对象地址。
可变参数可以不显示编写数组语法 public void function(Object ... args)中输入参数可以是几个对象,不用在一个数组中。对于可变参数,可以不传值进入方法。可变参数不依赖自动包装,传的是基本类型,其类型基本类型。
枚举类型关键字:enum 创建enum编译器自动添加一些特性:eg. toString方法;ordinal方法,特定常量的声明顺序;static value方法,按声明顺序产生由常量构成的数组。 enum相当于类