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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

构造函数:用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。

特点:
   1、该函数的名称和所在类的名称相同。
   2、不需要定义返回值类型。
   3、该函数没有具体的返回值。
   记住:所有对象创建时,都需要初始化才可以使用。
   注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。

   一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。


构造函数和一般函数有什么区别呢?

   1、两个函数定义格式不同。
   2、构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。
    一般函数,是对象创建后,需要调用才执行,可以被调用多次。

构造代码块和构造函数有什么区别?

   构造代码块 :给对象进行初始化,对象一建立就运行而且优于构造函数执行。
   构造代码块和构造函数的区别 :构造代码块是给所有对象进行统一初始化,而构造函数是给指定的对象进行初始化。
People p = new People();

   创建一个对象都在内存中做了什么事情?

   1、先将硬盘上指定位置的People.class文件加载进内存。
   2、执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
   3、在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
   4、在该实体空间中进行属性的空间分配,并进行了默认初始化。
   5、对空间中的属性进行显示初始化。
   6、进行实体的构造代码块初始化。
   7、调用该实体对应的构造函数,进行构造函数初始化。
   8、将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)
[code]class TestDemo
{

12 个回复

倒序浏览
貌似上面的代码每显示。class TestDemo
  1. class TestDemo
  2. {
  3.             static
  4.             {
  5.                          System.out.println("主函数静态代码块");
  6.             }
  7.            public static void main(String[] args)
  8.            {
  9.                         System.out.println("主函数开始");
  10.                         People p1 = new People(1);
  11.                         People p = new People();
  12.                         System.out.println("主函数结束");
  13.    }
  14. }
  15. class People
  16. {
  17.      //程序先运行静态代码块-->构造代码块-->构造函数
  18.             //构造代码块
  19.              {
  20.                          System.out.println("People构造代码块");
  21.              }
  22.              //静态代码块
  23.              static
  24.              {
  25.                             System.out.println("People静态代码块");
  26.              }
  27.              //构造函数
  28.              People()
  29.              {
  30.                           System.out.println("空参构造函数");
  31.              }
  32.              People(int num)
  33.              {
  34.                           System.out.println("一个参数的构造函数");
  35.              }
  36. }
复制代码
输出结果:
    主函数静态代码块
    主函数开始
    People静态代码块
    People构造代码块
    一个参数的构造函数
    People构造代码块
    空参构造函数
    主函数结束

回复 使用道具 举报
以上程序说明了它们的运行顺序为:  静态代码块 -->构造代码块 --> 构造函数
回复 使用道具 举报
讲解的非常好 学习了
回复 使用道具 举报
静态代码块只执行了一次
回复 使用道具 举报
fmi110 发表于 2015-10-8 09:45
静态代码块只执行了一次

嗯嗯, 你说的对, 就是执行一次,静态代码块只执行一次(加载类的时候)
回复 使用道具 举报
不甚了解,LZ也没有讲清楚,希望楼主补充一下笔记,讲的更完整一些。
回复 使用道具 举报
非常好,调理很清晰,谢谢分享
回复 使用道具 举报
构造函数,只被执行一次,就被回收么? 同时我看到创建对象中,是对各种情况的初始化,但是最后主体还是实体空间,除去new的空间初始化么?
回复 使用道具 举报
迷茫不堪的年纪 发表于 2015-10-9 00:05
构造函数,只被执行一次,就被回收么? 同时我看到创建对象中,是对各种情况的初始化,但是最后主体还是实 ...

构造函数不是只执行一次, 每当你new一个实例的时候,构造函数都会被执行一次。
当运行某程序的字节码时,首先把类信息(包括代码,static变量,字面量)加载到堆中的常量池中, 当new一个实例时,系统在堆中分配实例内存,存储其变量值和类中方法的引用
回复 使用道具 举报
不错
回复 使用道具 举报
赞!学习了!
回复 使用道具 举报
du_minchao 发表于 2015-10-9 07:59
构造函数不是只执行一次, 每当你new一个实例的时候,构造函数都会被执行一次。
当运行某程序的字节码时 ...

原来是这样啊,我可以理解为,构造函数就像门卡一样么, new一个实例出来就刷一次。 同时当程序运行时,先加载到堆里的常量池,new出来实例的时候在搞个内存,方便以后调用,。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马