分享
 
 
 

我的Thinking in Java学习笔记(八)

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

Array的初始化

array其实就是一组对象或者一组基本数据类型的数据,每一个array中的数据必须是同一种类型,并且以一个标示符封装在一起

例如 int[] i; 或者 int i[];

现在你这样声明一个array,但是array里面储存的其实是一组句柄,而非具体的数据对象,你必须要撰写初始化语句才能 让array变的有意义,初始化的方式同样有2种

int i[] = new int[3];或者是int i[] = { 1,2,3 };

需要注意的是第二种初始化方法,只能出现在array生成的时候。java允许你将某个array指派给另一个array,你所传递的其实只是句柄罢了,我们看个例子

public class arrays

{

public static void main(String args[])

{

int[] i = {1,2,3}; //声明一个数组,并且初始化

int[] ii; //只是声明一个数组

ii = i; //句柄的传递,并未把数组内的值传递,换句话说就是此时ii和i的句柄已经同时指向同一个内存地址

for(int j = 0; j<ii.length; j++)

{

ii[j]++; //我们只改变ii的值

}

for(int j = 0; j<i.length; j++)

{

System.out.println(" i[ "+j+" ]= "+i[j]); //显示i的值

}

}

}

我们回发现,i的值随着ii的改变而改变了,这个现象我们在赋值运算的时候已经讲过了。我们需要知道,任何一个array都有一个特性,通过他你可以知道array内的元素的个数,那就是length,因为java是从0开始检索数组的,也就是说该数组的最大索引值是length-1。如果你的索引值大于/小于实际容纳元素值,那么就会在程序的执行期得到数组越界例外,因为java会对数组进行边界检查,所以array的效率不是很高。如果你并不知道你所需要能能容纳多少元素的array,但是你却需要这么一个array,你可以采用new的方式来生成

public class arrays

{

public static void main(String args[])

{

int i[] = new int[3];

for(int j = 0; j<i.length; j++)

{

System.out.println(" i[ "+j+" ]= "+i[j]); //显示3个0

}

}

}

基本类型的array会自动初始化为0(与基本数据类型的成员数据的初始化值是一样的),但是你要是产生对象数组的话,你就必须指定初始化值

public class arrays

{

public static void go(Object[] o) //可以接受未定类型和个数的数组

{

for(int i=0;i<o.length;i++)

System.out.println(o[i]);

}

public static void show()

{

String[] s = new String[3]; //声明可以容纳3个元素对象数组,但是他们其实是3个句柄组成的句柄数组,并没有指向任何具体的内存块

s[0]="one"; //分别给每个句柄连接实际的对象,这才完成初始化动作,如果要是没有这一步,就会显示的是null

s[1]="two";

s[2]="three";

for(int j = 0; j<s.length; j++)

{

System.out.println(" i[ "+j+" ]= "+s[j]);

}

}

public static void main(String args[])

{

arrays.go(new Object[] {new String("a"),new String("b"),new String("c")});

arrays.show();

}

}

还有一种方法

public class arrays

{

public static void main(String args[])

{

String[] s = {"1","2","3"}; //因为数组的容量在编译期就确定了,所以用途很小

for(int j = 0; j<s.length; j++)

{

System.out.println(" i[ "+j+" ]= "+s[j]);

}

}

}

多维数组

public class arrays

{

public static void main(String args[])

{

System.out.println("This is Mulitdimentsional Arrays Demo One");

int[] [] ii={{1,2,3},{2,3,4}};

for(int i=0; i<ii.length ;i++)

{

for(int j = 0; j< ii[i].length ; j++)

{

System.out.println(" i["+i+"] ["+j+"]="+ii[i] [j]);

}

}

System.out.println("This is Mulitdimentsional Arrays Demo Two");

int[] [] [] iii = new int[2] [3] [4];

for(int i=0;i<iii.length;i++)

for(int j=0;j<iii[i].length;j++)

for(int k=0;k<iii[i] [j].length;k++)

System.out.println(" i["+i+"]["+j+"]["+k+"] = "+iii[i] [j] [k]);

System.out.println("This is Mulitdimentsional Arrays Demo Three");

Integer[] [] II= new Integer[2] [];

for(int i=0;i<II.length;i++)

{

II[i]=new Integer[5];

for(int j=0;j<II[i].length;j++)

{

II[i][j]=new Integer(4);

System.out.println(" i["+i+"] ["+j+"]="+II[i] [j]);

}

}

}

}

注意:多维数组中的每一组中括号代表arrays的层次,中括号从左到右分别代表大括号的从外到内

习题解答:

因为有的题目比较简单,实在是没有讲解的意义,我会把稍微有点难度的题目拿出来解答,但是也许大家的程度不一样,有的题目人家不觉得容易的你却觉得很容易,如果是这样的话,谁有问题可以从qq上或mail上告诉我,我会把答案给你写出来

12、撰写具有finalize()的class,并且保证他一定会被调用

class test

{

protected void finalize()

{

System.out.println(" finalize() running......");

}

public static void main(String args[])

{

new test(); //注意这里为什么写成new test(),而不写成test t = new test();原因就是这样写更容易引起垃圾回收器的注意

System.gc();

}

}

使用System.gc();可能会让你的finalize()调用,记住我们只是说可能,System.gc();只是一个请求,但是至于是否执行,不得而知。大家一定要记住,无论是垃圾回收还是终结动作,都不一定保证会发生,如果jvm没有面临资源紧张的情况,那么,他就不会去执行清理动作,以节省系统开支

Basically, there’s no way to ensure that finalize( ) will be called.

13、撰写一个名叫tank的类,此类的状态是满的或者是空的,他的死亡条件是,对象在清理的时候必须是空的,请撰写finalize()函数,来判断其死亡条件是否成立,并且

在main 中检测几种可能发生的情况

class Tank

{

static int counter = 0;

int id = counter++;

boolean full = false;

public Tank()

{

System.out.println("Tank " + id + " created");

full = true;

}

public void empty()

{

full = false;

}

protected void finalize()

{

if(full)

System.out.println( "Error: tank " + id +" must be empty at cleanup");

else

System.out.println( "Tank " + id + " cleaned up OK");

}

}

class tankTest

{

public static void main(String args[])

{

new Tank();

new Tank().empty();

System.gc();

}

}

16、撰写一个类,其中有2个string数据,一个在构造函数初始化,一个在定义处初始化,这2中方法有什么区别

class test

{

String s1="hello!";

String s2;

public test(String s)

{

s2=s;

}

public static void main(String args[])

{

test t =new test("goodbye");

System.out.println(t.s1); //static的函数只可以调用static的数据和函数,但是对象.数据的方式除外

System.out.println(t.s2);

}

}

s1的初始化动作是在构造函数调用之前就完成的~,而与此同时s2也被初始化,但是他被初始化成null,以后s2可以根据传递给构造函数的值的变化而变化,

更具有柔韧性。

18、撰写一个class,有一个string 数据,使用实体初始化的方式,并且说出与本书不同的用途

class test

{

String s;

{

s="hello!"; //注意不要写成 String s="hello",否则就成局部变量了!

System.out.println("Instance before constructor ");

}

test()

{

System.out.println(s+"from test()");

}

public static void main(String args[])

{

test t=new test();

}

}

书上的说的用途是,这种用法在匿名内部类(现在还没学到)中是必须用到,因为构造函数需要有个函数名,但是匿名内部类是没有名字的 ,于是我们需要用这种方法来初始化数据!我们再来说个用途:在一般的class中,实体初始化方式是在构造函数调用之前调用的,那么既然这样,这个程序会先显示Instance before constructor再显示hello! from test(),足以说明问题。

20、撰写一个函数,能够产生三维数组并且初始化,数组的容量由函数的引数决定,array的初始值必须是在函数因数所指定的范围内,再撰写一个函数,

可以打印出数组。在main函数中需要能够产生不同容量的数组

class test

{

//接受引数的函数,x、y、z分别代表数组中的元素,d1、d2代表数组的范围,并且该函数可以返回一个数组

public static double[][][] createArray(int x , int y , int z ,double d1,double d2)

{

double[][][] darray = new double[x][y][z]; //定义一个数组,未初始化

double incr = (d1-d2)/(x * y * z); //计算每个数组值的增量,因为咱们数组的值要在d1-d2的范围中

double value=d2; //数组中每一个元素的值,并且让他初始值等于传递引数的最小值

for( int i =0 ; i<darray.length ; i++) //初始化数组

for( int j =0 ; j < darray[i].length ; j++)

for( int k =0 ; k < darray[i][j].length ; k++)

{

darray[i][j][k]=value; //给每个元素指派值

value=incr+value; //重新类加值,用于下次运算

}

return darray; //返回一个数组

}

public static void showArray(double[][][] darray) //显示数组的函数

{

for( int i =0; i<darray.length ; i++)

{

for( int j=0; j<darray[i].length; j++)

{

for( int k =0; k<darray[i][j].length ;k++)

System.out.println("darray["+i+"]["+j+"]["+j+"] = "+darray[i][j][k]);

}

System.out.println("*****************"); //打印分割符

}

}

public static void main(String args[])

{

double[][][] test =createArray(2,3,4,11.0,2.0);

showArray(test);

}

}

好了以上就是第四章所有的内容,知识点的东西很少,基本上全是需要理解的东西,看不懂的地方多看几便就好了~,我开始的时候看了3遍才明白呢~呵呵~驽钝

下一篇我们讲解的第五章 隐藏实现细目 希望大家继续捧场

大家有什么问题,可以这样联系我

E-mail molmd@163.net /163.com QQ:31349283 我们可以共同学习进步!

欢迎访问我的blog,http://blog.csdn.com/maoerzuozuo 里面有更多学习内容!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有