首页 > 代码库 > 001:java面向对象

001:java面向对象

1:构造函数

判断下列程序的执行结果:

class Demo 
{
    static Demo demo = new Demo();

    Demo(){
        System.out.println("构造函数");
    }
}
class Test
{
    public static void main(String[] args) 
    {
        new Demo();
    }
}

    分析:类内的同类名静态变量在加载类时就已经创建,所以没有问题。

判断下列程序的执行结果:

class Demo 
{
    Demo demo = new Demo();

    Demo(){
        System.out.println("构造函数");
    }
}
class Test
{
    public static void main(String[] args) 
    {
        new Demo();
    }
}

分析:创建对象的时候,先开辟空间,然后给非静态成员变量demo分配空间,默认初始化,值为null,然后调用构造函数进栈,构造函数进栈执行的时候明显要执行隐式三步,隐式三步的第二步,是给变量demo赋显示值,所以此时又要创建对象。

在创建对象时都不会完成,都只能停留在隐式三步的第二步。

 

2:隐式三步

    第一、super调用父类的构造函数。

    第二、给对象空间中的变量赋显示值。

    第三、执行构造代码块。

因为上面这三步即使在构造函数中没有书写,也会执行,所以叫做隐式三步;(如果构造函数中通过this语句调用了其他构造函数,这个函数中就没有隐式三步,而是在被调用的那个函数中存在隐式三步)

隐式三步完成之后,才来执行构造函数中的代码;

 

3:构造代码块与静态代码块

    静态代码块:用static修饰的代码块;

class Test
{
static { System.out.println("静态代码块。。。"); }
}

    构造代码块:前面不需要使用static修饰;

class Test
{  
    {
        System.out.println("构造代码块。。。");
    }
}

 

4:累的加载过程

JVM发现要使用一个类,就去方法区去找这个类。

  1:找到了直接使用

  2:没找到就去硬盘上找这个类,寻找的地址是由classpath配置的地址决定的,如果未配置classpath,就在当前路径找

  3:找不到就报错

  4:找到了,就加载到内存的方法区中,

          1:首先加载静态成员变量到静态区域,非静态成员变量到非静态区

      2:成员加载完成,为静态成员分配空间。

      3:按顺序给所有的静态成员变量赋显示值,同时执行静态代码。

      4:所有静态代码块执行完毕,类加载完成

    

5:对象的创建过程

  1:JVM遇到new关键字,就去内存中开辟空间。

  2:在空间中为所有非静态成员分配空间,赋默认值。

  3:调用相应的构造函数

  4:构造函数进栈后,执行隐式三步

  5:执行构造函数中代码

  6:构造函数出栈,对象创建完成。

 

001:java面向对象