JAVA中一个类包含String数组怎么初始化的?
我编写了一个类A,然后类B中包含类A的数组,在创建类B的变量时,必须要对类B中的类A数组的每个元素进行初始化才可以使用,但是对一个包含String数组的类C,在创建类C的...
我编写了一个类A,然后类B中包含类A的数组,在创建类B的变量时,必须要对类B中的类A数组的每个元素进行初始化才可以使用,但是对一个包含String数组的类C,在创建类C的变量时,即使不对类C中String数组的每个元素初始化依然可以使用,这是为什么?
具体大概是这样的:
//类A
public class A {
int a = 0;
}
//类B
public class B {
A[] as = new A[5];
public B() {
for(int i = 0;i < 5;i++){
as[i] = new A(); //*
as[i].a = i;
}
}
}
//类C
public class C {
String[] s = new String[5];
}
//主程序
public class test {
public static void main(String[] args) {
B b = new B();
b.as[1].a = 3;
C c = new C();
c.s[1] = "3";
}
}
在类B中如果去掉了带*号的一行就会出现异常(NullPointerException);而类C中则不用new String。
我看了下String的定义,没弄明白,我想知道是怎么做到的,我希望可以写到类A中,可以不用写*号那一行 展开
具体大概是这样的:
//类A
public class A {
int a = 0;
}
//类B
public class B {
A[] as = new A[5];
public B() {
for(int i = 0;i < 5;i++){
as[i] = new A(); //*
as[i].a = i;
}
}
}
//类C
public class C {
String[] s = new String[5];
}
//主程序
public class test {
public static void main(String[] args) {
B b = new B();
b.as[1].a = 3;
C c = new C();
c.s[1] = "3";
}
}
在类B中如果去掉了带*号的一行就会出现异常(NullPointerException);而类C中则不用new String。
我看了下String的定义,没弄明白,我想知道是怎么做到的,我希望可以写到类A中,可以不用写*号那一行 展开
5个回答
展开全部
不可以滴!!
因为在B中,如果没有了带*的那一行,那么仅仅只是代表 有存在一个存放A类型数组:as[i],但是里面每个元素到底存放什么我们是不知道的,在JAVA里面,就是引用为空的意思,既as[i] = null。就是说里面其实是没有任何东西的,仅仅只有一个定义而已,那怎么可以指向A类里面的a属性呢?因为as[i]指向的东西都为空,空就是代表没有任何东西,那么里面自然也不会有a这个属性咯。所以我们在声明完数组的时候,必须把数组里面的元素也申明了。但是为什么C可以呢。
你看C是这样做的:
C先声明了一个数组,所以只要存在C的实例,就可以使用到这个数组。虽然这时候,数组里面的元素是为空的,但是你在主程序里面使用了c.s[1]="3",意思就是为c实例里面的数组的第2个元素给申明了,而不是直接引用,这与B是不同的。
——————————————————————————————————————————————————————
B-->不为空,所以可以使用B里面的元素,既as数组,但是as数组里面的元素是空的,所以不存在里面有某种属性的说法,自然是不可是使用A类里面的元素a咯。
C--》不为空,所以可以使用C里面的元素s数组,然后对s数组进行操作。
祝你好运!!希望你能够理解
因为在B中,如果没有了带*的那一行,那么仅仅只是代表 有存在一个存放A类型数组:as[i],但是里面每个元素到底存放什么我们是不知道的,在JAVA里面,就是引用为空的意思,既as[i] = null。就是说里面其实是没有任何东西的,仅仅只有一个定义而已,那怎么可以指向A类里面的a属性呢?因为as[i]指向的东西都为空,空就是代表没有任何东西,那么里面自然也不会有a这个属性咯。所以我们在声明完数组的时候,必须把数组里面的元素也申明了。但是为什么C可以呢。
你看C是这样做的:
C先声明了一个数组,所以只要存在C的实例,就可以使用到这个数组。虽然这时候,数组里面的元素是为空的,但是你在主程序里面使用了c.s[1]="3",意思就是为c实例里面的数组的第2个元素给申明了,而不是直接引用,这与B是不同的。
——————————————————————————————————————————————————————
B-->不为空,所以可以使用B里面的元素,既as数组,但是as数组里面的元素是空的,所以不存在里面有某种属性的说法,自然是不可是使用A类里面的元素a咯。
C--》不为空,所以可以使用C里面的元素s数组,然后对s数组进行操作。
祝你好运!!希望你能够理解
展开全部
半天没弄明白你说的意思,但是我猜跟一个知识点有关:类的变量可以不用初始化,但是方法的局部变量必须要初始化的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-08-21
展开全部
as[i] = new A() ; A 是类,是要初始化的。String是简单类型,不需要new。
追问
String的定义是一个类啊
追答
是类,不一样的类。
还有 int floag double boolean 等,都不需要实例化
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
仔细对比下这两句话:b.as[1].a = 3; c.s[1] = "3";
一个有两个点,一个只有一个点。
第二句来说,只要new了c这个对象,就会有了s[i],即使s[i]没有指向任何东西,
但是第一句,new了b对象后,同样道理你引用as[i]是可以的,但是问题是你的as[i]没有指向任何东西,所以你再又引用as[i]的a这个属性,肯定就不行了。
一个有两个点,一个只有一个点。
第二句来说,只要new了c这个对象,就会有了s[i],即使s[i]没有指向任何东西,
但是第一句,new了b对象后,同样道理你引用as[i]是可以的,但是问题是你的as[i]没有指向任何东西,所以你再又引用as[i]的a这个属性,肯定就不行了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
A[] as = new A[5]; 创建一个数组,其中每个元素为A对象。由于a变量是A类中的成员变量,其他类中想访问a,必须通过new A对象的构造子来创建引用( as[i] = new A();),然后才能 将i赋值给A对象(as[i].a = i;);
String[] s = new String[5]; 是创建一个字符串数组,他属C对象的成员变量, C c = new C();以经new了C的构造子,当然可以给成员变量赋值( c.s[1] = "3";)。
想要去掉B类中带*号的 只要将 a变量设置成static 就可以 static int a=0; 静态变量 可以直接用类名字调用 ,不需要先new。
String[] s = new String[5]; 是创建一个字符串数组,他属C对象的成员变量, C c = new C();以经new了C的构造子,当然可以给成员变量赋值( c.s[1] = "3";)。
想要去掉B类中带*号的 只要将 a变量设置成static 就可以 static int a=0; 静态变量 可以直接用类名字调用 ,不需要先new。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询