在解释关键字的第三种用法时,我们有必要重新整理一下对象的初始化过程。 以下面的代码为例:
com..学习;
班级书{
书(味精){
.out.(消息);
班级 {
Book book1 = new Book("book1成员变量初始化");
Book book2 = new Book("成员book2成员变量初始化");
(消息){
.out.(消息);
Book book3 = new Book("book3成员变量初始化");
Book book4 = new Book("成员book4成员变量初始化");
无效主([]参数){
p1 = new("p1初始化");
//~
在上面的例子中,类中组合了四个Book成员变量,两个是普通成员,两个是修饰类成员。 我们可以看到,当我们new一个对象时,首先初始化被修改的成员变量,然后是普通成员,最后调用类的构造函数完成初始化。 也就是说,在创建对象时,会先初始化被修改的成员,而且我们也可以看到,如果有多个被修改的成员,则会按照它们的顺序进行初始化。
其实装饰成员的初始化可以更早完成,看下面的例子:
班级书{
书(味精){
.out.(消息);
班级 {
Book book1 = new Book("book1成员变量初始化");
Book book2 = new Book("成员book2成员变量初始化");
(消息){
.out.(消息);
Book book3 = new Book("book3成员变量初始化");
Book book4 = new Book("成员book4成员变量初始化");
空白 () {
.out.("修改后的方法");
无效主([]参数){
.();
。出去。(”****************”);
p1 = new("p1初始化");
//~
在上面的例子中,我们可以发现两个有趣的地方。 第一个是当我们不创建对象,而是通过类调用类方法时,即使该方法没有使用任何类成员,但类成员在方法调用之前就被初始化了,这意味着当我们第一次使用一个类时,会触发该类的成员初始化。 第二个是,当我们使用类方法时,完成类的成员的初始化后,再new类的对象,被修改的类成员不会被再次初始化,也就是说被修改的类成员在程序运行过程中只需要初始化一次,不会被多次初始化。
回顾完对象的初始化之后,我们看的第三个函数就很简单了,就是当我们初始化修改的成员时,我们可以将它们放在一个以大括号开头并用大括号括起来的块语句中:
班级书{
书(味精){
.out.(消息);
班级 {
Book book1 = new Book("book1成员变量初始化");
书本2;
{
book2 = new Book("成员book2成员变量初始化");
book4 = new Book("成员book4成员变量初始化");
(消息){
.out.(消息);
Book book3 = new Book("book3成员变量初始化");
书书4;
空白 () {
.out.("修改后的方法");
无效主([]参数){
.();
。出去。(”****************”);
p1 = new("p1初始化");
//~
我们稍微修改一下前面的例子,可以看到结果是一样的。