谁能告诉我关于自定义类 (作为类型)所构造的对象数组在new 时其内存是如何分配的,谢谢!
具体类与问题如下:
//以下是自定义的类
public class Sss {
private int a;
private Sss next;
public Sss(){
System.out.println("no parameter constructor is called");
}
public Sss(int a, Sss next){
this.a = a;
this.next = next;
System.out.println(" parameters constructor is called");
}
public int getA (){
return a;
}
public Sss getNext(){
return next;
}
}
public class Test {
public static void main(String [] args){
Sss [] b = new Sss[5];
for (int i = 0 ; i < 5; i++)
System.out.println(b[i]);
System.out.println("/////////////");
Sss c = new Sss();
System.out.println(c.getA());
System.out.println(c.getNext());
System.out.println("/////////////");
System.out.println(c);
}
}
输出结果如下:
null
null
null
null
null
/////////////
no parameter constructor is called
0
null
/////////////
packageA.Sss@1fb8ee3----------
我不太明白为什么会输出null,对象数组是不是只是根据该对象类型去分配一个(足以放下“引用”)的空间啊,或者说相当于申明一个引用类型,而实际并没有用new到内存堆上开辟出每个Sss的真实空间啊??如果是,按理应该至少会去调用Sss中的一个构造函数吧,但是结果没有哦,谁能来帮我解答下,先谢了。我想进一步知道的是不是基本上没个非基本类型的“引用”所占空间是否一样大,我不是指引用所指向的对象。
具体类与问题如下:
//以下是自定义的类
public class Sss {
private int a;
private Sss next;
public Sss(){
System.out.println("no parameter constructor is called");
}
public Sss(int a, Sss next){
this.a = a;
this.next = next;
System.out.println(" parameters constructor is called");
}
public int getA (){
return a;
}
public Sss getNext(){
return next;
}
}
public class Test {
public static void main(String [] args){
Sss [] b = new Sss[5];
for (int i = 0 ; i < 5; i++)
System.out.println(b[i]);
System.out.println("/////////////");
Sss c = new Sss();
System.out.println(c.getA());
System.out.println(c.getNext());
System.out.println("/////////////");
System.out.println(c);
}
}
输出结果如下:
null
null
null
null
null
/////////////
no parameter constructor is called
0
null
/////////////
packageA.Sss@1fb8ee3----------
我不太明白为什么会输出null,对象数组是不是只是根据该对象类型去分配一个(足以放下“引用”)的空间啊,或者说相当于申明一个引用类型,而实际并没有用new到内存堆上开辟出每个Sss的真实空间啊??如果是,按理应该至少会去调用Sss中的一个构造函数吧,但是结果没有哦,谁能来帮我解答下,先谢了。我想进一步知道的是不是基本上没个非基本类型的“引用”所占空间是否一样大,我不是指引用所指向的对象。
这条语句确实只是分配了5个引用的空间。而java的所有内存在new之后,都自动是默认值的,对于引用,就自动是null;所以你得到的都是null。我觉得可以这么理解:Sss obj;这条语句只是定义了一个Sss的引用,要获得对象,必须使用obj=new Sss()。相应的,Sss[] b;只是定义了对象(引用)数组的引用,第一次new只是先获得引用数组的空间,然后再用b[i]=new Sss()获取每个对象。在不创建对象的时候,是不会调用构造函数的。
Sss [] b = new Sss[5];
for (int i = 0 ; i < 5; i++)
b[i] = "";非对象数组,默认值为0
int[] is = new int[100];
是给你空间 了呀,能放五个Sss的空间给你的,可你放什么进去了呀,就像你去开房,开了五间房,但能说明五间房里都有美女等你吗
而4楼的问题我再说一下:
一个java源文件只能有一个public的类,这个与平台无关.
================================================
存放此类型的什么东西呢? 我的理解就是存放引用。String obj1; Sss obj2; 这样是在栈上定义了两个引用。不同类型的引用,我认为具有相同的大小,不过也未必,java中我不知道有没什么办法获得类型占用空间的大小。这两篇文档可能有点帮助:
http://blog.csdn.net/davidweini/archive/2007/12/20/1955871.aspx
http://blog.csdn.net/kdnuggets/archive/2007/12/04/1916936.aspx
Sss sss=new Sss();
Sss[] b = new Sss[5];
b[0]=new Sss();
b[1]=new Sss();
b[2]=new Sss(3, sss);
b[3]=new Sss();
b[4]=new Sss();
for (int i = 0; i < 5; i++)
System.out.println(b[i]); System.out.println("/////////////"); Sss c = new Sss(3, sss);
System.out.println(c.getA());
System.out.println(c.getNext());
System.out.println("/////////////");
System.out.println(c); }
}