一.
说完了静态关键字的一些特点和使用注意事项,同时也交代了静态应用场景以后。现在准备写个具体的例子,将前面的知识点串起来。
这个例子从最基础的开始穿起。
需求:求数组最大值
最开始,我们的写法是将代码写在主函数里面,运行一下就可以了。下面是我们之前学习时的解题方法。
(代码中的每一句话都是有其存在的意义的,没有意义和作用的语句可以不用写。public static void main(String[] args)这句话是保证程序的独立运行的,但是本类不需要独立运行,所以本类中没有主函数。)
DOS一运行上面截图中的程序,需求就解决了。但是,我们说以后不要再这么写代码了。主函数只是入口,是用来调用其他程序。那么,这里应该怎么写?
截图中的求最大值程序只能求解一个数组的最大值,数组arr,和for语句中x
为了提高代码的复用性,要将功能封装起来。(这就是我们后来讲的函数。开始是数组,然后由数组衍生出一系列的操作,接着就是函数封装功能) 之前讲述的时候,只有主函数一个,所有的代码都放置在主函数里。现在把代码封装起来,进行复用,我们可以对很多数组求最大值。只要把数组告诉我们就可以了。
这时,定义一个功能,获取整型数组的最大值。
对下面的程序进行展开讲解,public是修饰符,表明最大的访问权限(不太懂?自己的理解)。static的存在,是因为本类中,主函数也是static修饰的,主函数要想调用本方法,必须是static修饰的(?),getMax方法参数中的arr和主函数中的arr不是同一个东西,只是重名。功能函数最后要返回最大值。需求就是获取最大值,返回值就是数组中的最大值。
封装功能过后的程序书写如下,主函数中的内容大大缩减。到目前,我对主函数的理解就是,主函数就像一个控制面板,上面就几个按钮。每个按钮背后复杂的工作都被影藏了起来。
函数的出现提高了复用。接着扩展一下思维,另外的一个类中,也需要求解最大值,(这时就不是在一个类中求解了)。而且不关是求解最值,排序,折半..全都需要,这就意味着有很多方法,现在应该怎么办?
按照对象的思想。我们不应该把它们都定义成方法,而是应该把这些方法放置在一个类里面,换句话说,就是封装到对象里面去。我找到了操作数组的对象,是不是找到了操作数组这个功能啊?这是个过渡,从最早期的主函数,过渡到我们自定义的函数进行封装,再过渡到把我们所需的众多功能,进行对象(那么这个对象里面全是方法?对象的参数列表怎么写?)进行封装。我们不再面向过程,而是面向对象。因此,我们这里单独写了一个类。这个类写完以后,我能用,你也能用。
在第二个方法中,有一个特殊的地方,if语句中应该是 进行位置置换,位置置换是个功能,在这写个功能就完事了。这种开发方式很多见,因为我们的思路就建立在我这块肯定需要一个功能,我们不用管怎么实现,先写个这个功能,后面再去细解怎么实现这个功能。
swap功能是给selectSort服务的,不需要提供出去,所以用private修饰。swap的参数列表是三个,给一个数组,再给两个变量(就是两角标)。因为我们要置换的是数组中的两个两个位置,数组明确吗?数组不明确。这里是如何调用swap方法的呢?在selectSort方法的某一个语句中,调用了swap方法。先是有确定的数组调用了seleceSort方法,在selectSort方法被执行的过程中,selectSort方法又调用了swap方法,具体的调用书写为swap(arr, x, y); 这里是不需要返回值的。
在来个简单查找,这里的return -1是什么意思,忘记了。
这里还有一个打印数组的功能,把数组变成字符串应该是一个方法,返回的是一个字符串,这里面最简单的就是用字符串连接的方式,大家都知道,任何数据和字符床相加,想连接。String str=""; 是null么?这是一个真实的字符串,只是里面没有内容而已,
(首先是将所有的方法集合在一个类中,里面的方法间,也会有联系)
至此,把这个功能写完了,封装在了一个对象叫ArrayTool里面,叫做数组工具对象。接着结合之前的类,我们想要来一个数组的最值获取。
对象写完以后,我们想要求最值怎么办?
这里其实是两个java文件,一个是ArrayTool.java,还有一个是ArrayToolDemo.java。ArrayToolDemo.java文件中包含有主函数,ArrayToolDemo是别人写的,准备用我们的工具。两个文件,先编译谁?按理说,先编译ArrayTool,ArrayToolDemo是在用ArrayTool。如果连ArrayTool.class文件都没有,怎么使用
DOS中将执行的顺序表示了出来。
接着又做了一些改变,如下。本类做了改变,工具类并没有发生变化。
接着有趣的事儿来了,先编译了ArrayToolDemo.java,一编译,两个类都出来了。
解析:ArrayTooleDemo它这个类中确实用到了ArrayTool.class,可是ArrayTool.class它有吗?是没有的,java编译器很有意思,它发现了该类中用到了其他类,它会去classpath路径下找这个类,或者去当前目录下找这个类,一找发现没有,它会继续找,找什么?找和这个类名相同的.java文件。因为这个类通常对应着一个源文件,找到源文件,对其进行编译,再产生这个class文件。