黑马程序员技术交流社区

标题: 定义一个类,创建此类数组,再给数组中元素创建对象的问题 [打印本页]

作者: 杨博    时间: 2013-3-9 23:38
标题: 定义一个类,创建此类数组,再给数组中元素创建对象的问题
class Test7
{
        public static void main(String[] args)
        {
                String[] cs={"黑桃","红桃","方块","梅花"};
                String[] ns={"A","2","3","4","5","6","7","8","9","10","J","Q","K"};

                Puker[] ps=new Puker[cs.length*ns.length]; //可以装入52个扑克对象  ps中的元素在的值是null
                int index=0;
                for(int i=0;i<cs.length;i++){
                       
                        for(int j=0;j<ns.length;j++){
                               
                                //ps[index++]=new Puker(cs,ns[j]);
                               
                                ps[index]=new Puker();                                ps[index].setColor(cs);
                                ps[index].setNumber(ns[j]);
                                index++;

                        }
                }


                for(int i=0;i<ps.length;i++){
                        if(i%ns.length==0){
                                System.out.println();
                        }
                        ps.print();

                }
        }
}


class Puker
{
        private String color;
        private String number;
        Puker(){}

        Puker(String color,String number){
                this.color=color;
                this.number=number;
        }

        void setColor(String color){
                this.color=color;
        }
        String getColor(){
                return color;
        }

        void setNumber(String number){
                this.number=number;
        }
        String getNumber(){
                return number;
        }

        void print(){
                System.out.print(color+number+"  ");
        }
}
就是关于代码红色部分,求解代码在内存中的执行过程,最好附图,谢谢各位大神了
作者: 聂斌    时间: 2013-3-10 01:04
Puker[] ps=new Puker[cs.length*ns.length]

ps是数组类型,数组是一种单独的数据类型,数组属于引用数据类型

在内存中分别有一个堆内存,和栈内存,当我们读Puker[] ps的时候呢其实是在栈内存当中定义了一个局部变量ps,,这个局部变量ps他会在栈内存中开辟一个空间,这个空间里面有个ps,而new出来的东西不在栈内存里面而在堆内存中,凡是new出来的实体都在堆内存,堆内存里面存放的就是实体,实体包括数组和对象,数组也能称之为对象.,,,此时堆内存这部分一new Puker就在堆里面产生了一个空间,这个空间就是数组,这个大箱子一产生呢他里面有52个格子要放52个元素,所以这个大空间里面就分配了52个格子,而这每个格子呢都有一个编号,数组里面元素的类型是Puker对象类型,,,此时每个小格子里面都有个默认的初始化值null,那么这个堆内存和栈内存中的ps(就这个对象)他们2者之间怎么联系起来呢???,那么2者之间的联系是什么呢,???,,看下面的堆内存特点,,

堆内存的特点:
堆内存中的每一个实体都有一个存放位置,内存里面都是地址值,都是些二进制那些地址就是些数字,用这个地址呢来标识数据存放的位置,那么这个数组在内存中存放的时候他总有一个起始位置,,这个起始位置用16进制来表示,因为16进制他表示起来更短,,这个地址假设是0x0078,,那么这个地址0x0078就作为这个数组在堆内存中存放的一个首地址值,,那么用0x0078来标识数组位置的话,,我们只需要将这个0x0078地址值赋给栈内存当中的ps,注意这个是一个赋值动作,,赋的不是数组本身,而是数组在内存中的地址,,赋完以后那么栈内存当中的ps就有值了,,,此时栈内存当中的ps就指向了那个数组或者叫ps引用了那个数组,,数组没有真正的存放到ps变量中去,,而是ps只存放数组的内存地址,,他在引用那个数组而已......这个就是数组指向,,ps就指向那数组了,,


ps[index]=new Puker();   
意思是:循环一次就new一个Puker对象,,然后把Puker对象的内存地址值赋给了 ps[index],,,就是说ps里面的52个小格子里存放的都是Puker对象内存地址值,,,

作者: 杨博    时间: 2013-3-10 02:02
聂斌 发表于 2013-3-10 01:04
Puker[] ps=new Puker[cs.length*ns.length]

ps是数组类型,数组是一种单独的数据类型,数组属于引用数据类 ...

前面你说的我懂,很感谢你的详细回答,我有点疑惑的是你最后说的两句,ps[index]=new Puker(); 这句话中,是不是就是new 一个Pucker对象后,Pucker获得了对象的地址,那么对象所包含的内容也存在堆内存中,他们之间如果想进行调用,比如我想对任意两个进行互换,内存中是如何操作的

作者: 聂斌    时间: 2013-3-10 02:13
如果互换数组里的2个Pucker对象,,那么这2个对象在内存中是没有变化的,,,变化的是数组里角标对应的元素,,,,只要操作数组就可以,,

堆内存中有52个Pucker对象,数组里面存放的就是52个Pucker对象的地址值,,,,比如你想交换角标0和角标1上的元素就是:
Pucker temp=ps[0];
ps[0]=ps[1];
ps[1]=temp;
这样就交换位置了,,他们操作的都是地址值,,,做的是赋值操作
作者: 杨博    时间: 2013-3-10 02:33
聂斌 发表于 2013-3-10 02:13
如果互换数组里的2个Pucker对象,,那么这2个对象在内存中是没有变化的,,,变化的是数组里角标对应的元素,,,, ...

交换这个动作也是在堆内存中进行的吗?
作者: amen0205    时间: 2013-3-10 04:43
Puker[] ps=new Puker[cs.length*ns.length];   //  在堆内存中开辟数组空间   数组引用ps 指向该空间 空间大小52
ps[index]=new Puker();     // 在堆内存创建puker()对象  被数组中的一个值指向。即把该对象的地址值存放到数组中。
作者: 聂斌    时间: 2013-3-10 10:31
交换这个动作是在堆内存中进行的




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