黑马程序员:Java对象的初始化过程

来源:互联网 发布:长虹led32538数据 编辑:程序博客网 时间:2024/06/04 17:52
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

说Java对象的初始化过程之前,先说说如何禁止类建立对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Demo
{
    private int x;
    private Demo(){} //出现错误的原因,默认构造函数被自定义且被private修饰
    Demo(int x)
    {
        this.x = x;
    }
    void show()
    {
        System.out.println(x); 
    }
}
class NoDemo
{
    public static void main(String[] args)
    {
        new Demo(); //出现错误,若注释掉则程序无异常
        new Demo(3).show();
    }
}

终端返回的错误:

NoDemo.java:18: 错误: 找不到符号
        new Demo();
        ^
  符号:   构造器 Demo()
  位置: 类 Demo
1 个错误

总结:若默认构造函数被自定义且被private修饰,则不可以创建类似new Demo()对象,除非类中自定义了其他构造函数,那么调用者就可以创建对应构造函数的对象了。若无其他自定义构造函数或调用者未知,就相当于这个类不可以创建对象

 

下面进入正题:

Java对象的初始化过程

如:PersonTwo p = new PersonTwo();

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class PersonTwo
{
    String name = "lisi";   //显示初始化优先于构造代码块
    {
          //若显示初始化不优先,则这句构造代码块应该出错,而实际是正常运行
        System.out.println(name);  
    }
}
class PersonDemoTwo
{
    public static void main(String[] args)
    {
        PersonTwo p = new PersonTwo();  //结果输出 lisi
    }
}

运行顺序如下:

  • new用到了PersonTwo.class,所以会先找到PersonTwo.class文件并加载到内存中
  • 执行该类中的static代码块,如果有的话,给PersonTwo.class类进行初始化
  • 在堆内存中开辟空间,分配内存地址
  • 在堆内存中建立对象的特有属性(成员变量),并进行默认初始化
  • 对属性进行显示初始化
  • 对对象进行构造代码块初始化
  • 对对象进行对应的构造函数初始化
  • 将内存地址付给桟内存中的p变量。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net