代码如下:
class Shape {
Shape()
{
System.out.println("Shape");
}
}
public class test {
public static void main(String[] args) {
Shape[] s = new Shape[9];
for(int i = 0; i < s.length; i++)
s[i] = new Shape();
}
}
对new关键字我有一些疑问,
1.两个new的作用分别是什么?
2.如果把Shape换成基本数据类型,问题1的答案是什么?
解释的越清楚越好,小弟实在有些糊涂。。
class Shape {
Shape()
{
System.out.println("Shape");
}
}
public class test {
public static void main(String[] args) {
Shape[] s = new Shape[9];
for(int i = 0; i < s.length; i++)
s[i] = new Shape();
}
}
对new关键字我有一些疑问,
1.两个new的作用分别是什么?
2.如果把Shape换成基本数据类型,问题1的答案是什么?
解释的越清楚越好,小弟实在有些糊涂。。
解决方案 »
- 简单的抛硬币问题?不知错在哪了?
- 普通类可以定义为静态的吗?为什么?
- 新手,如果问题太傻不要笑我
- 用java HSSF读取Excel文件出错!!! 大家来帮帮忙吧!!
- 请问各路大神100的阶乘的各个位数之和怎么求?比如10的阶乘是3628800,那我要求的结果是3+6+2+8+8+0+0=27
- 怎么理解“如果必须向上转型,则继承才是必要的。”这句话
- java 多线程实现生产者模型问题
- 为什么我在JEditorPane中的横向滚动条不起作用?
- 十万火急:各位大虾帮帮小弟吧。如何把informix数据库中的中文字段写如到一个文件中?
- 不懂就问
- sun.net.ftp.FtpClient再提问
- 用BigDecimal类做除法运算问题
是new 一个shape类型的数组对象
s[i] = new Shape();
是new 一个shape类型的对象
第一个new是new一个数组对象,这个数组中装的Shape类型的引用,指向不同的Shape对象,这些对也就是
new Shape()生成的对象,
这个‘s’为数组开辟的一个引用对象,'new'就是开辟了一个空间
s[i]=new Shape();
在同样的类型下,在每个数组中的元素指定一个Shape
可以这样的哦理解
你拿了一个大箱子装了9个同样类型的小箱子
这个‘s’为数组开辟的一个引用对象,'new'就是开辟了一个空间
s[i]=new Shape();
在同样的类型下,在每个数组中的元素指定一个Shape
可以这样的哦理解
你拿了一个大箱子装了9个同样类型的小箱子
有点勉强,呵呵
这个‘s’为数组开辟的一个引用对象,'new'就是开辟了一个空间
s[i]=new Shape();
在同样的类型下,在每个数组中的元素指定一个Shape
可以这样的哦理解
你拿了一个大箱子装了9个同样类型的小箱子
有点勉强,呵呵
for(int i = 0; i < s.length; i++)
s[i] = new Shape(); //创建一个Shape类型的数组元素,只不过这里的元素类型还是Shape类型的
s是一个数组对象的引用,在java里面,数组也是对象第二个new,也就是s[i] = new Shape();
s[i]是一个Shape对象的引用。
如果是换作基本数据类型,
s仍然是一个数组对象的引用,而s[i] = new int ()是有编译错误的。
Shape s1;Shape s2;Shape s3;Shape s4;一直到Shape s9;
然后实例化他们,Shape s=new Shape();Shape s1=new Shape(); Shape s2=new Shape();一直到Shape s9=new Shape();
2.第二个new用于实例化Shape对象
如果换成:
int[] s = new int[9];
for(int i=0;i<s.length;i++)
s[i]=new Integer();//不能用new int,得用基本类型int的包装类Integer
class Shape
{
Shape()
{
System.out.println("Shape()");
}
}public class test
{
public static void main(String arg[])
{
Shape[] arr = new Shape[9];
Class cls = arr.getClass();
System.out.println(cls.getConstructors().length);
}
}
结果是0,说明没有构造函数.何解?
是new 一个shape类型的数组对象,这时候,每个元素本身并没有new出来,只对Sahpe数组分配内存。
s[i] = new Shape();
是new 一个shape类型的对象,会调用Shape的构造函数。public class test
{
public static void main(String arg[])
{
Shape[] arr = new Shape[9];
Class cls = arr.getClass();
System.out.println(cls.getConstructors().length);
}
}
结果是0,说明没有构造函数.何解?
cls.getConstructors()=0,并不代表Shape[]没有被new,JVM对数组的初始化和
用构造函数初始化普通对象是不同的。
用 System.out.println(cls.getName());打印出的是 [Lcom.Shape,它是没有构造函数的,
cls.getConstructors().length就是0.
数组的初始化和普通类型,int,double初始化一样,只是分配内存而已,不过数组本身在java中又是对象类型。
对new关键字我有一些疑问,
1.两个new的作用分别是什么?
第一个是新建数组对象,就是一个机器位数的字节数.比如32位机器就是4字节;2.如果把Shape换成基本数据类型,问题1的答案是什么?
一样的.
1>栈: 它里面存放基本数据类型和引用,它由编译器自动申请和释放
********栈中的空间有限
例: int a =10;//变量a存放在栈中
2>堆: 堆中的空间需要程序员自己申请和释放(JAVA中你不需要关心释放) 注意:想在堆中申请必须new
********堆中的空间是无限
例:new Shape[9];// 9个Shape 对象就分别存放在堆中
但是:Shape[] s =new Shape[9];// s 是存放在栈中的,因为它是引用型的
问题二:
基本数据类型不能new
不会使用new 基本数据类型,但可以new基本类型的数组对象