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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王利强 中级黑马   /  2012-3-10 00:03  /  7877 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在堆内存中建立对象的特性先进行默认初始化,再进行显示初始化,那么什么是显示初始化,不太清楚,能解释下么?

11 个回复

倒序浏览
本帖最后由 房宝彬 于 2012-3-10 00:10 编辑

显示初始化,就是声明赋值, 默认初始化就是 默认值

比如说 int i = 0; 这就叫显示初始化,


引用数据类型是有默认值的,不声明赋值也有默认值,这就叫默认初始化/r/n;
         
回复 使用道具 举报
本帖最后由 贠(yun)靖 于 2012-3-10 00:14 编辑

  而显示初始化 是你自己给变量赋值  系统默认的是隐士初始化
回复 使用道具 举报
贠(yun)靖 发表于 2012-3-10 00:12

自己画的?
回复 使用道具 举报
房宝彬 发表于 2012-3-10 00:13
自己画的?

是啊~~!  看过视频 然后自己总结画的
回复 使用道具 举报
你应该去搞艺术
回复 使用道具 举报
王杰 黑马帝 2012-3-10 00:35:26
7#
说简单点,显示初始化就是对类中字段成员进行初始化。
回复 使用道具 举报
黄秋 黑马帝 2012-3-10 04:28:36
8#
前言:因是N年前学习JAVA的,时间久了,故基本概念模模糊糊。早几天有人提显示初始化,脑海中没这概念,但却涌现“显式初始化”,这家伙会不会就是它?搜了搜,显示初始化、显士初始化、隐士初始化等等,就是以前的“显式初始化”,“隐式初始化”。不知是我当年好运,还是孤陋寡闻,反正没什么"显示初始化"的记忆。

体会:当年这样记的,将显式、隐式联系起来,因它们是相对的。

  • 显式初始化--- 明显地初始化,自己主动,变量在显示屏上看得到被初始化了。
  • 隐式初始化--- 隐蔽地初始化,自己没有,变量在显示屏上看不到被初始化,实际上是JVM偷偷地、隐隐地赋默认值给变量。

实验+总结:
  1. class  Test
  2. {
  3.         int a=1;         //显式初始化
  4.         int b;         //隐式初始化
  5.         public static void main(String args[]){
  6.                 int c;
  7.                 Test t=new Test();
  8.         System.out.println(t.a);
  9.         System.out.println(t.b);        //可打印b,因自动赋默认值0
  10.         // System.out.println(c);        //编译出错:尚未初始化变量 c
  11.         c=5;                                                //初始化变量 c
  12.                 System.out.println(c);        //c已赋值,可打印        
  13.         }        
  14. }
复制代码
打印不了,是因没初值--->没初值,是因方法内的变量不会自动赋默认值(即隐式初始化)。
成员变量(类的属性)会隐式初始化,局部变量(方法定义的变量)不会隐式初始化,调用前必须赋值。
回复 使用道具 举报
石德志 黑马帝 2012-3-10 07:34:57
9#
"在堆内存中建立对象的特性先进行默认初始化,再进行显示初始化,那么什么是显示初始化,不太清楚,能解释下么? "楼上的没能正面回答楼主的问题啊,楼主是在问在对象建立的时候系统先进行默认初始化,然后在进行显式初始化。。。。。。。这和构造函数的调用过程有关

这得从对象的建立过程谈起,例如:
class Person{
int age;
boolean isMarried;
static int sex ;
public Person(int age,blooean isMarried,int sex){
this.age = age;
this.isMarried = isMarried;
this.sex = sex;
}
}

当 Person p1= new Person(20,true,1);Java虚拟机会先找到Person类的Person.class字节码文件加载到内存,当类的字节码被加载的时候static静态成员就会被初始化赋值,基本类型的数值型都会被默认初始化为零;接着在内存堆中为Person对象分配足够的存储空间,该存储空间会被清零,对象内的所有成员变量会被默认初始化赋值,基本类的数值型被默认为零,blooean默认为false,(age = 0 ,isMarried = false,sex = 0),接着会执行构造函数(会隐式的回溯调用父类的无参数的构造函数)显式的为对象各个成员赋值(age = 20,isMarried = ture ,sex = 1);
回复 使用道具 举报
对象的得来,应该就3种吧 一种是new  2 通过类的静态方法返回一个对象 3运行中类的实例即反射
不过对象的初始化问题都是调用构造函数而来的吧,调用默认的构造函数就是隐式初始化,如果再参数就是显示初始化化,举简单的String类来说
Sring str;//但是编译失败,要么通过如上方法建立一个对象,要么把str当做基本类型变量其实也必须要给他显示初始化。

Sring str=“ada”;//显示初始化,这里字符串常量是放常量池里的,把str当做基本类型变量来做。

Sring str=new String();//另外一种默认初始化 区别是专门在堆内存开辟个空间存放字符串

Sring str=new String(“ada);//功能同上,只是显式初始化。
回复 使用道具 举报
例如:int[] x ={5,3,6};
一开始系统会在栈内存中定义一个变量x,在堆内存中会定义一个整形的数组,数组长度为3,系统会把数组0角标的元素的地址值付给x(也就是说x指向了整形数组),此时,由于数组是整形的,所以数组里边元素默认值是0,即x[0],x[1],x[2]都是0。这一步是默认初始化

然后系统会把5,3,6三个数存进数组中,此时x[0] = 5,x[1] = 3,x[2] = 6;这一步是显示初始化

基本上每一个初始化的动作都分为默认初始化和显示初始化两步,默认初始化就是根据你定义的类型,然后付给对象相应的初始化默认值,比如 int类型默认初始化值为0,String类型的默认初始化值为null等;显示初始化就是你付给对象的值,比如,你让 x=5,就是把默认初始化时x的0值改为5
回复 使用道具 举报
贠(yun)靖 发表于 2012-3-10 00:12
而显示初始化 是你自己给变量赋值  系统默认的是隐士初始化

加油  长江后浪推前浪{:2_31:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马