5.1 用构造器确保初始化
1、在Java中,通过提供构造器,类的设计者可确保每个对象都会得到初始化。创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。
2、不接受任何参数的构造器叫做默认构造器。构造器的名称必须与类名完全相同。
3、从概念上讲,“初始化”与“创建”是彼此独立的,在Java中,“初始化”和“创建”捆绑在一起,两者不能分离。
5.2 方法重载
1、构造器是强制重载方法名的另一个原因。既然构造器的名字已经由类名所决定,就只能有一个构造器名。
5.2.1 区分重载方法
1、每个重载的方法都必须有一个独一无二的参数类型列表。甚至参数顺序的不同也足以区分两个方法,不过一般情况下不这么做。
5.2.2 涉及基本类型的重载
1、基本类型能从一个“较小”的类型自动提升至一个“较大”的类型。
5.2.3 以返回值区分重载方法
1、根据方法的返回值来区分重载方法是行不通的。
5.3 默认构造器
1、默认构造器(无参构造器)是没有形式参数的—它的作用是创建一个“默认对象”。如果类中没有构造器,则编译器会自动帮你创建一个默认构造器。如果已经定义了一个构造器(无论是否有参数),编译器就不会帮你自动创建默认构造器。
5.4 this关键字
1、对于一个方法,不确定被哪个对象调用?为了能用简便、面向对象的语法来编写代码–即“发送消息给对象”,编译器做了一些幕后工作。它暗自把“所操作对象的引用”作为第一个参数传递给方法。
2、this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。this的用法和其他对象引用并无不同。但要注意,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用即可。当前方法中的this引用会自动应用于同一类的其他方法。
3、只有当需要明确指出对当前对象的引用时,才需要使用this关键字。
4、参数s和数据成员s的名字相同。使用this.s来代表数据成员就能解决该问题。
5.4.2 static的含义
1、static方法就是没有this的方法。在static方法的内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。
5.5 清理:终结处理和垃圾回收 (JVM)
1、finalize()方法的工作原理:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发送时,才会真正回收对象占用的内存。所以,如果打算使用finalize(),就能再垃圾回收时刻做一些重要的清理工作。
2、①对象可能不被垃圾回收。②垃圾回收并不等于“析构”③垃圾回收至于内存有关
3、《JVM书籍》
5.6 成员初始化
1、Java尽力保证:所有变量在使用前都能得到恰当的初始化。
5.6.1 指定初始化
5.7 构造器初始化
1、可以用构造器来进行初始化。在运行时刻,可以调用方法或者执行某些动作来确定初值,为编程带来了更大的灵活性。无法阻止自动初始化的进行,它将在构造器被调用之前发生。
5.7.1 初始化顺序
1、在类的内部,变量定义的先后顺序决定了初始化顺序。即使变量定义散步在方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。
5.7.2 静态数据的初始化
1、如果一个域是静态的基本类型域,且也没有对它进行初始化,那么它就会获得基本类型的标准初值;如果它是一个对象引用,那么它的默认初始值就是null。
初始化
2、总结一下对象的创建过程,假设有个名为Dog的类:
①即使没有显式地使用static关键字,构造器实际上也是静态方法,因此当首次创建类型为Dog的对象时(构造器可以看成静态方法),或者Dog类的静态方法/静态域首次被访问时,Java解释器必须查找类路径,以定位Dog.class文件。
②然后载入Dog.class,有关静态初始化的所有动作都会执行。因此,静态初始化只在class对象首次加载的时候进行一次。
③当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间。
④这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型都设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。
⑤执行所有出现于字段定义处的初始化动作。
⑥执行构造器。
5.7.3 显示的静态初始化 static{}
1、static静态代码块仅执行一次:当首次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即便从未生成过那个类的对象)
5.7.4 非静态实例初始化{}
1、和静态初始化一样,只不过少了static关键字。无论调用了哪个显示的构造器,这些操作都会发生。实例初始化子句在构造器之前执行的。
5.8 数组初始化
1、数组只是相同类型的,用一个标识符名称封装到一起的一个对象序列或基本类型数据序列。
2、对于数组,初始化动作可以出现在代码的任何地方,但也可以使用一种特殊的初始化表达式,它必须在创建数组的地方出现。这种特殊的初始化是由一对花括号括起来的值组成的。在这种情况下,存储空间的分配(等价于使用new)将由编译器负责。
3、数组元素中的基本类型值会自动初始化成空值(对于数字和字符,就是0;对于布尔型,是false)
4、如果创建了一个非基本类型的数组,就创建了一个引用数组。
5.8.1 可变参数列表
1、getClass()方法属于Object的一部分,将产生对象的类,并且在打印该类时,看到表示该类类型的编码字符串。
2、可以在单一的参数列表中将类型混合在一起,而自动包装机制将有选择地将int参数提升为Integer。
3、应该总是只在重载方法的一个版本上使用可变参数列表。
5.9 枚举类型
1、枚举类型的实例是常量,按照命名惯例都用大写字母表示。
2、枚举中ordinal()方法,用来表示某个特定enum常量的声明排序。Values()方法,用来按照enum常量的声明顺序,产生由这些常量值构成的数组。
3、enum用做另外一种创建数据类型的方式,直接将所得到的类型拿来使用。
5.10 总结
1、构造器能保证正确的初始化和清理(没有正确的构造器调用,编译器就不允许创建对象),所以有了完全的控制,也很安全。
第五章 初始化与清理
最新推荐文章于 2021-02-26 00:44:16 发布
155

被折叠的 条评论
为什么被折叠?



