黑马程序员技术交流社区

标题: new的知识点 [打印本页]

作者: 胡文彬    时间: 2014-3-15 18:34
标题: new的知识点

本帖最后由 李兆宁 于 2012-8-10 10:48 编辑


class Array2
{
        public static void main(String[] args)
        {
                int[] arr = new int[]{2,4,12};
                int[] brr = {2,4,1};
        }
}

学习视频中,对于数组的定义,初始化时用new与不用new的区别在哪里呢?
什么时候需要new,什么时候不需要,有硬性规定吗?

另外问个小技巧,看视频中,老师用单行注释,一次注释多行,是怎么注释的呢?
(就是先选定要注释的行,然后就在每一行的前面加上注释符了)像:

class Array2
{
        public static void main(String[] args)
        {
                //int[] arr = new int[]{2,4,12};
                //int a = 9;
                //int[] brr = {2,4,1};
        }
}

作者: 周定宁    时间: 2014-3-15 19:10
new的执行过程:

1)先在内存中划分一块空间,类中的member内容拷贝到此空间,这时memeber属性得到应有的空间,member方法拥有可执行代码

2)自动初始化该对象的属性变量,使用缺省值初始化

3)初始化其需要显示赋值的属性,将缺省值覆盖,写入显示值,这叫属性显示赋值初始化

4)调用该对象的构造,执行构造的方法体,构造也可以接收一些初始化参数,用于生成对象时对属性进行初始化操作

5)对象生成,此时将对象首地址传入引用变量
作者: 黄飞1991    时间: 2014-3-15 19:15
int[] arr = new int[]{2,4,12};
int[] brr = {2,4,1};
这是同一种数组格式。

一维数组有2种格式;
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
作者: 文江江    时间: 2014-3-15 19:27
1、new创建的对象和数组存放在堆内存中(一new则创建对象),int[] brr = {2,4,1}的写法是对数组进行静态初始化,等号右边相当于产生了一个数组对象,也是存放在对内存中。因此,个人认为两种没有多大区别,只是写法不同啦。
2、老师用单行注释,一次注释多行,是怎么注释的呢?这个是用eclipse中的快捷键Ctrl+/。

作者: 李猛    时间: 2014-3-15 20:37
如果只是初始化,就数组而言,那么数组可以赋值null,或者什么等号后面什么也不写也行,默认也是null,如果new以后就是手动赋值啦,数组的值就不在是null
作者: zms2100    时间: 2014-3-15 21:12
答案二、三楼基本上都讲完了,补个点:
什么时候需要new? 当你不确定数组中元素时就用new;
例如有那么些类似小操作题:  遍历数组,将数组元素指定为1—1000;
如果要自己给数组int[] arr初始化赋值上面,多少代码要打到吐血,但你可以知道这个数组的长度肯定是1000;
因此:  int[] arr = new int[1000];  
         for(int i =0; i<arr.length;i++){
            arr[ i ] = i + 1 ;
         }
而当数组长度很短,你又知道数组元素时可以直接初始化赋值,除特殊情况外没必要 new ,直接赋值操作,代码既简洁也节约内存空间。

话多了,不过再教多LZ一个小招,有时候黑马试题会考: (总会看到,算加强记忆吧)
就是数组、集合等对象中 new 的在内存中的操作(也就是为什么上面说节约内存空间);
    String s1 = "string";                          //内存空间中创建了"string"这个字符串常量;
    String s2 = new String("string");        //创建了一个String实例并指向已有的"string"字符串常量;
    String s3 = new String("string");        //同上,但是是属于不同上者新String实例,即内存地址值不同;
    System.out.println(s1==s2);
    System.out.println(s2==s3);              //这两个比较的就是s1、s2、s3的内存地址值;
    System.out.println(s1.equals(s2));
    System.out.println(s2.equals(s3));      //这两个比较的是s1、s2、s3的字符串内容是否相同;
慢慢体会,这里不止一个知识点的,O(∩_∩)O~
作者: 战狼    时间: 2014-3-16 09:26
第一种注释为Ctrl+/,还有一种是ctrl+shift+/(这种是带星号的注释)




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2