zoukankan      html  css  js  c++  java
  • 对象的创建过程

    static数据:

      无论创建多少个对象,静态数据都只占用一份存储空间。static关键字不能应用与局部变量,因此它只能作用于域。如果一个域是静态的基本类型域,且没有对它进行初始化,那么它就会获得基本类型的标准值;如果它是一个对象引用,那么它的默认初始化值是null。

    例子:

    class Bowl{
        Bowl(int marker){
            System.out.println("Bowl (" + marker + " )");
        }
        
        void f1(int marker){
            System.out.println("f1( " + marker + " )");
        }
    }
    
    class Table{
        static Bowl bowl1 = new Bowl(1);
        
        Table(){
            System.out.println("Table()");
            bowl2.f1(1);
        }
        
        void f2(int marker){
            System.out.println("f2( " + marker + " )");
        }
        
        static Bowl bowl2 = new Bowl(2);
    }
    
    class Cupboard{
        Bowl bowl3 = new Bowl(3);
        static Bowl bowl4 = new Bowl(4);
        
        Cupboard(){
            System.out.println("Cupboard()");
            bowl4.f1(2);
        }
        
        void f3(int marker){
            System.out.println("f3( " + marker + " )");
        }
        
        static Bowl bowl5 = new Bowl(5);
    }
    
    public class StaticInitialization {
        public static void main(String[] args) {
            System.out.println("Createing new Cupboard() in main");
            new Cupboard();
            System.out.println("Creating new Cupboard() in main");
            new Cupboard();
            table.f2(1);
            cupboard.f3(1);
        }
        
        static Table table = new Table();
        static Cupboard cupboard = new Cupboard();
    }
    /*output:
    Bowl (1 )
    Bowl (2 )
    Table()
    f1( 1 )
    Bowl (4 )
    Bowl (5 )
    Bowl (3 )
    Cupboard()
    f1( 2 )
    Createing new Cupboard() in main
    Bowl (3 )
    Cupboard()
    f1( 2 )
    Creating new Cupboard() in main
    Bowl (3 )
    Cupboard()
    f1( 2 )
    f2( 1 )
    f3( 1 )
    */

    分析:

      主类是StaticInitialization,要执行main()(静态方法),必须加载StaticInitialization类,然后它的静态域table和cupboard被初始化,这使得它们对应的类也被加载,由于这些类包含了静态的Bowl对象,因此Bowl也被加载。

      静态域的初始化在非静态成员变量初始化之前。

    小结对象的创建过程,假设有一个名为Dog的类:

      1.即使没有显式地使用static,构造器实际上也是静态方法。因此,当首次创建类型为Dog的对象时,或者Dog类的静态方法、静态域首次被访问时,java解释器必须查找类路径,以定位Dog.class文件。

      2.然后加载Dog.class,有关静态初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。

      3.当new Dog()创建对象时,首先将在堆上为Dog对象分配足够的存储空间。

      4.这块存储空间会被清零,这就自动将Dog对象中的所有基本类型数据设置成默认值(对数字来说就是0,对布尔类和字符型也是如此),而引用则被设置成null。

      5.执行所有出现于字段定义处(成员变量)的初始化动作。

      6.执行构造器。

  • 相关阅读:
    JMS ActiveMQ研究文档
    HDD-FAT32 ZIP-FAT32
    C++中出现的计算机术语2
    提供一个免费的CSDN下载账号
    读完了csapp(中文名:深入理解计算机系统)
    IOS成长之路-Nsstring中搜索方法rangeOfString
    PHP汉字转拼音的两种方法+PHP提取汉字(中文)方法
    最小二乘法
    防止tab页重复的去请求服务端
    探索Android中的Parcel机制(上)
  • 原文地址:https://www.cnblogs.com/aristole/p/8003832.html
Copyright © 2011-2022 走看看