A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 史晓霞 黑马帝   /  2011-11-11 06:53  /  2023 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

静态代码块,构造代码块和构造函数存在内存的什么位置?

4 个回复

倒序浏览
静态代码块,构造代码块和构造函数都是被对象共享的,因此存放在共享区,只有非静态属性存放在堆内存中
回复 使用道具 举报
Java的内存分配有三种,
1、静态存储区:内存在程序编译时就分配好了,比如静态变量;
2、栈区:各种原始数据类型的局部变量都是在栈上创建的,当程序退出该变量的作用范围的时候,这个变量的内存会被自动释放。
3、堆区:对象(包括数组)都是在堆中创建的。程序在运行的时候用new关键字来创建对象,对象创建时会在堆中为其分配内存。
静态代码块,构造代码块和构造函数是在类创建时就分配好,应该是存在静态存储区。
回复 使用道具 举报
1,构造函数:  
    a,函数名和类名相同。  
    b,没有返回值类型。  
    c,函数中不写return语句。  
      
    作用:可以对对象进行初始化。  
  
    比如:Person p = new Person();这句代码都做什么事情?  
        a,加载Person.class 文件。  
        b,在堆内存中开辟空间,创建实例对象。  
        c,对对象中的属性进行默认初始化。  
        d,对对象中的属性进行显示初始化。  
        e,对对象进行自定义的初始化,通过构造函数来完成的。  
        f,在栈内存中定义变量存入对象的地址值,指向该对象。  
    什么时候定义构造函数呢?  
    在分析事物的时候,这个事物在一建立就需要一些属性或者执行一些行为。  
    这时就将这些属性和行为在构造函数中操作。  
  
    构造函数和一般函数在运行上的不同:  
        构造函数:在对象建立时,立刻调用与对应的构造函数。  
        一般函数:在对象建立后,需要执行时,在会被对象所调用。  
      
    注意:  
    在用class定义的类中,jvm会自动的在该类添加一个默认的构造函数,该函数是空参数的 。  
    如果类中自定义了构造函数,那么默认的构造函数消失。  
  
    构造函数在类中存在多个,是以重载的形式体现的。  
  
    构造函数之间互相调用,是通过this语句来完成的。  
    this语句一定定义在构造函数第一行,因为初始化动作要先执行。  
  
------------------------------  
  
this关键字:  
    this代表本类对象,this在函数内部,代表着该函数所属对象的引用。  
            其实就是哪个对象调用this所在的函数,this就代表哪个对象。  
  
    什么时候定义这个this?  
    当定义功能时,该功能内存使用到了本类对象时,就用this来表示。  
  
  
    用法:可以用来区分局部变量和成员变量同名的情况。  
    class Person  
    {  
        int age;  
        Person(int age)  
        {  
            this.age = age;  
        }  
        public boolean compare(Person p)  
        {  
            return this.age == p.age;  
        }  
    }  
  
    main()  
    {  
        Person p1 = new Person(30);  
        Person p2 = new Person(20);  
        p1.compare(p2);  
  
        p2.compare(p1);  
    }  
  
--------------------------------------------  
static关键字:  
    特点:  
      -- 随着类的加载而加载,随着类的消失而消失,静态成员的声明周期最长。  
      -- 优先于对象存在。  
      -- 被所有对象所共享。  
      -- 可以直接被类名所调用。类名.静态成员。  
  
    注意事项:  
      -- 静态方法只能访问静态成员。  
      -- 静态方法中不可以写this,super关键字。  
      -- 主函数是静态的。  
  
    static是一个修饰符,只能修饰成员。被它所修饰的成员在共享区(方法区)中。  
  
    可以想想饮水机的例子。  
  
------------------------------------------  
主函数:可以被jvm所调用也直接用类名所调用,jvm到底给主函数传递了什么样的实际参数呢?  
    jvm传递是new String[0].  
    java Demo haha hehe  
------------------------------------------  
  
设计模式:解决某类问题行之有效的方法。  
java 23种设计模式。  
  
单例设计模式:保证了类在内存中的对象唯一性。  
步骤:  
    1,私有化构造函数,不让其他类建立该类对象。  
    2,定义一个私有并静态的本类对象。  
    3,定义一个静态的方法对外提供该对象。  
  
class Single  
{  
    private static Single s = new Single();  
    private Single(){}  
    public static Single getSingle()  
    {  
        return s;  
    }  
}  
  
class Single  
{  
    private static Single s = null;  
    private Single(){}  
    public static /*synchronized*/ Sinlge getSingle()  
    {  
        if(s==null)  
            s = new Single();  
        return s;  
    }  
}  
  
-----------------------------------------  
  
静态代码块:  
    特点:随着类的加载而执行,执行一次,优先于主函数执行。  
    作用,用于给类进行初始化的。  
  
-----------------------------------------  
  
内部类:  
    其实就是将类定义在另一个类的里面,内部类可以定义在外部类的任意位置上。  
    内部类可以直接访问外部类中的成员,那是因为内部类只有一个外部类的引用,外部类名.this  
    而外部类要访问内部类必须建立内部类对象。  
      
    什么时候用内部类呢?  
        描述事物时,该事物内部还有事物,那么可以通过内部类来描述。  
  
    当内部类在成员位置上的时候,可以被成员修饰符所修饰。比如,private static 。  
    当内部类中定义了静态成员时,内部类必须是静态的,但是静态内部类就出现了访问局限性。  
  
    当内部类在具备位置上的时候,只可以访问被final修饰的局部变量。  
    被final修饰的局部变量是一个常量,只可以被赋值一次。
回复 使用道具 举报
我喜欢看提问和好些回答- -
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马