2005/06/07 | Java编程编程基础(3)
类别(Music) | 评论(0) | 阅读(171) | 发表于 08:36
呵呵,昨天一休息就下班了,今天补上,下面来看数组与函数重载。
一:一维数组
1。数组的概念不说了,大家应该都明白,举个例子:
假如定义100个变量,我不可能这样做吧x1 x2 .....x100,即使你有耐心那10000个呢?在Java中可以这样实现
引用:

int x[] =new int[100];


x[]是一个数组变量的引用,new int[100]创建一个100个int变量的数组对象。
也可写成这样:
引用:

int x[];
x=new int[100];


还可以这样定义:
引用:

int [] x;
x=new int[100];



定义了一个int型的数组,分别有x[0] x[1]....x[100]组成。
至于用种办法因人而异,但不要弄混了就可以了。
以下为数组所有变量的求和方法:
引用:

int sum;
for (int i=0;i<100;i++)
{
sun+=x[i];
}


数组中可使用x=null,这样数组也就成为了垃圾!直至垃圾回收器来收走了,关于垃圾回收器的解释如下:


注:
在Java中内在的划分为:堆内存与栈内存。所有的基本类型变量与引用变量,全部是栈内存,离开作用范围后,这些内存马上被释放掉。new与数组存放在堆内存,由垃圾回收器自行处理。
关于垃圾回收器的说明引用一篇文章程:
引用:

JAVA使用垃圾回收器进行对象的内存空间回收,而且垃圾回收器是自动调用的,不需要用户的干预。一般情况下,用户只需要垃圾回收器就可以处理完所有对象的回收工作,但是在有些情况下,例如:用户需要把对象在创建过程中创建的图形擦除,打开的文件关闭,或者对象在创建过程中使用外部程序(如C++)创建了非JAVA对象(非JAVA对象不能用垃圾回收器自动回收)等等,则这些情况都需要用户使用另外的方法进行清除,JAVA中这个方法叫 finalize(),这个方法可以在类中定义,然后垃圾回收器在自动回收该类的对象前,会自动调用该类的finalize(),先进行其定义的特殊清除工作。
在 Java 中,所有对象都驻留在堆内存,因此局部对象就不存在。当你创建一个对象时,Java 虚拟机(JVM)为该对象分配内存、调用构造器并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时),JVM 通过垃圾回收器将该对象标记为释放状态。
当垃圾回收器要释放一个对象的内存时,它首先调用该对象的finalize() 方法(如果该对象定义了此方法的话)。垃圾回收器以独立的低优先级的方式运行,所以只有当其他线程都挂起等待内存释放的情况出现时,它才开始释放对象的内存。(理论上,你还可以调用System.gc() 方法强制垃圾回收器来释放这些对象的内存。)
在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行finalize()。如果在 Applet 或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用finalize()。
其次,除非垃圾回收器认为你的Applet或应用程序需要额外的内存,否则它不会试图释放不再使用的对象的内存。换句话说,有可能出现这样的情况:一个 Applet 给少量的对象分配了内存,但没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存程序就退出了。
显然,如果你为某个对象定义了finalize() 方法,JVM可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。即使调用System.gc() 也可能不会起作用,因为它仅仅是给 JVM 的一个建议而不是命令,所以finalize()方法的作用也就不是那么明显。Java 1.1中有一个System.runFinalizersonExit()方法部分地解决了这个问题。(不要将这个方法与 Java1.0中的System.runFinalizations()方法相混淆。)不象System.gc() 方法那样,System.runFinalizersonExit()方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的finalize()方法。
结论:你不应当依靠垃圾回收器或finalize() 来执行你的 Applet 和应用程序的资源清除工作。取而代之,你应当使用确定的方法来清除那些资源或创建一个try...finally 块(或类似的机制)来实现


我们来看一个具体的例子:
引用:

public class TestArray
{
    public static void main(String [] args)
    {

        int x[];
        x=new int[100];
        
        for(int i=0;i<100;i++)
        {
            System.out.println("x"+i+"="+x[i]);
        }
    }
}



2。数组静态初始化
数组的静态初始化就是定义数组的同时赋值给数姐。
例如:

引用:

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


也可这样写:
引用:

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


关于数组使用就注意的几个问题:
a:数组不进行初始化,赋值默认为0。
b:如果数组等于null,那么就不能再对数组进行任何操作,否则会引起数组异常。
c:数组不能指定长度,int ia[5]=new int[]这是一个错误的例子。
d:关于下标越界问题,就是你定义了4个长度的数组,非要输入第5个数组变量的值,这样肯定是不可以的,借此说一下length的应用:
引用:

public class TestArray
{
    public static void main(String [] args)
    {
        int a[]=new int[]{1,2,3,4,5,6};
        for (int i=0;i<a.length;i++)
        System.out.println("a"+i+"="+a[i]);
    }
}


大家应该明白length的用法了吧,不多说了

二:多维数组
1。多维数组的定义
有了上面一维数组的基础,多维数组就应该是好理解多了,其实Java中不存在真正的多维数组而只是数组的数组,从而开成一个x*y的矩阵,来看多维数组的定义:
引用:

int [][]x=new int[2][3]


其数组变量为:x[0][0] x[0][1] x[0][2] x[1][0] x[1][1] x[1][2]
2。多维数组的静态初始化
引用:

int [][]x={{3,2},{1,2},{1,2,5}};


3。两个常用的函数
a:System.arraycopy(source,0,dest,0,x)
应用实例:
引用:

public class TestArrayCopy
{
    public static void main(String [] args)
    {
int ia[]=new int[]{1,2,3,4,5};
int ib[]=new int[]{9,8,7,6,5,4,3};

System.arraycopy(ia,0,ib,0,3);
// 复制源数组中从下标0开始的3个元素到目的数组,从下标0的位置开始存储。
for(int i=0;i<ia.length;i++)
System.out.print(ia[i]);
         System.out.println();

for(int j=0;j<ib.length;j++)
System.out.print(ib[j]);
            System.out.println();
    }
}



b:Arrays.sort不多了排序详情查找jdk文档

数组说完了,下面看一下函数的重载,其实就是子函数的应用。

二:函数
1。函数
函数的就是把重复用到的代码做成一个公用的代码块,每次用到这个代码块直接调用就可以了,看例子:
引用:

public class Func1
{
    public static void main(String [] args)
    {
/* 下面是打印出第一个矩形的程序代码*/
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<5;j++)
            {
                System.out.print("*");
            }
            System.out.println(); //换行
        }
        System.out.println();
        //下面是打印出第二个矩形的程序代码
        for(int i=0;i<2;i++)
        {
            for(int j=0;j<4;j++)
            {
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println();//换行
        //下面是打印出第三个矩形的程序代码
        for(int i=0;i<6;i++)
        {
            for(int j=0;j<10;j++)
            {
                System.out.print("*");
            }
            System.out.println();
        }
        System.out.println();

    }
}



改成函数:
引用:

public class Func2
{
public static void drawRectangle(int x,int y)
    {
        for(int i=0;i<x;i++)
        {
            for(int j=0;j<y;j++)
            {
                System.out.print(" * ");
            }
            System.out.println(); //换行
        }
        System.out.println();    
    }
    
    public static void main(String [] args)
    {
     drawRectangle(3,5);
        drawRectangle(2,4);
        drawRectangle(6,10);
    }
}



2。return的应用
来看例子:
引用:

public class Func3
{
public static int getArea(int x,int y)
    {
        return x*y;
    }
    
    public static void main(String [] args)
    {
        int area = getArea(3,5);
     System.out.println("first Acreage is " + area);
     System.out.println("second Acreage is "+ getArea(2,4));
     getArea(6,10);
    }




上面例子是返回x*y的值
再看一个无返回值的例子,通常做安全检测使用
引用:

public class Func4
{
        public static int getArea(int x,int y)
        {
            if(x<=0 || y<=0)
            {
                 return -1;
            }
            return x*y;
        }
    
        public static void main(String [] args)
        {
            int area = getArea(3,5);
            System.out.println("first Acreage is " + area);
            System.out.println("second Acreage is "+ getArea(2,4));
            getArea(6,10);
        }
}



三:函数的重载
来看一个例子我们再做说明:
引用:

public class Test
{
    public static void main(String [] args)
    {
        int isum;
        double fsum;
        isum=add(3,5);
        isum=add(3,5,6);
        fsum=add(3.2,6.5);
    }
    public static int add(int x,int y)
    {
        reutrn x+y;
    }
    public static int add(int x,int y,int z)
    {
        return x+y+z;
    }
    public static double add(double x,double y)
    {
        return x+y;
    }
}




通过上面例子大家看到的情况是在同一个类中允许多个同名函数存在,只是函数的形参个数不同,或者类型不同!这就是函数的重载。

题外话:
前面我们配置了Java运行环境及环境变量的设置,才可以做到Java的运行。
我们调试到了第一个Java程序:helloworld.java至于public staitc void main(String [] args)是意思,在后面马上就会说到,大家先背下来吧。然后又说了常量、变量、流程、函数及函数的重载!接下就是面向对象。比较难理解!有时间再整理出来!
另外整理读书笔记真是一件很辛苦的活,不过这样做的的确确是有益于理解书本中的知识,想起了csdn中有个哥们译think in java真是了不起,更想象不到,他对java理解的深入,所以给大家学习的一个建议,多总结!想象把你掌握的东西让别人也撑握到,那才是了不起的一件事!
0

评论Comments

日志分类
首页[271]
Life[195]
Music[24]
Know[23]
Photo[17]
Service[7]
English[5]