最初接触到的计算机编程语言是c语言,再有了c语言的基础上,Java入门也变得简单多了。Java其实是一个地名,盛产咖啡,所以图标像咖啡一样,然而慢慢接触,你才能体会到Java的甘甜。
Java的运行时在虚拟机上面的,也就是说Java相比于c语言直接接触硬件的操作安全的多,Java用虚拟内存访问数据,我编译Java用的是Eclipse这个软件,这个软件是完全免费的,初学者可以到官网去下载。当你安装好Eclipse的时候,是不能使用的,因为缺少运行环境,你还需要下载一个JDK,也就是给Java运行的环境。有趣的是,编译Java程序的软件就是用Java语言编写的,有点哲学的味道。
我是在李兴华老师的指导下学习Java的。刚接触Java就感觉不陌生,因为有一定的编程基础了。在我的感觉中,Java比c语言仿佛方便的多,c语言总是要提心吊胆的想着分配内存,而Java却没有那么有板有眼,你什么时候需要了,什么时候使用new + 构造器(Constructor),开辟空间,JVM能自动分配内存。还有一点让我感到方便的是,在c语言中,使用变量之前要先定义,后使用。而Java人性化的地方是你可以随用随定义,这样做有很多好处,如果这个变量只参与过程,那么也不用担心浪费内存空间,因为GC直接就帮你处理掉了。
Java是面向对象的语言,其中出现了类(class)的概念,在我对Java的理解中,程序以类聚,类以对象分,意思是对象可以实现类的功能,不知道这样的描述准不准确。所谓类与对象,对象由类来规范,类有对象的统一定义。比如我家的黑猫、老张家的白猫,这些具体的个体就是对象,每个对象都有自己独特的特点,而猫科动物,就是囊括了这些特点的集合,不论黑猫白猫,都属于猫科动物这个类中,所以不管黑猫白猫小花猫,能实例化好就是好对象。
运行Java程序就需要定义的类中有主方法,就像c程序一样是从main函数开始执行的原理一样,这样才能运行,否则只是一个类没有主方法,那只能是对该类的对象的定义,而不能运行。Java中使用class关键字来定义一个类,类的名称可以任由自己取,但是需要注意的是,定义的public类的名称必须与文件的名称保持一致。
变量、函数我们都是非常熟悉的使用它们了,在你定义的时候加入了一个static关键字定义一个变量,加入这个关键字修饰之后就变成了类变量,这个类变量就属于在你声明的这个类里了。当你创造对象的时候,可以通过对象来访问这个类变量,但是实际上对象本身是没有类变量的,之所以可以访问,因为对象知道自己属于类,而这个类变量也属于类,所以顺理成章的就可以访问了。类函数原理相同。
接着我们说一说重载,重载就是说可以定义多个可以存在相同名字的函数,功能可以不一样。这些函数的参数不一样,有可能参数的个数或者类型,或者都不相同,听起来很厉害,但是实际上却不那么难。Java方便就在于它面向对象的概念,从重载中也能体现,如果你要在c语言中计算整数的和,浮点数的和,那么你需要创造两个不同的函数,而在Java中,你却可以创造一个方法,然后往方法里面传递不同的参数,这样是不是就简便了许多?
接触到了抽象你就接近了Java更深层次的知识了。首先我们先从字面上理解,抽象,就意味着具体的,细节不足的。如果你有了这种想法,那么你就掌握了抽象的不二法门。所谓抽象函数,就是表达概念而无法具体实现代码的函数,抽象类就是表达概念而无法制造出实体的类,我们不难发现,抽象就是一个概念,仅仅存在于理论中,那么你会像我刚接触到的时候一样充满疑惑,既然抽象什么都制造不出来,那它有什么用?别着急,我慢慢给你讲来。这个抽象是为了更好的把具有相同特点的事物分类,通过子类来覆写父类的方法,然后就可以实现对应的功能。抽象的具体应用就是接口(Interface)。接口是完全抽象的类,若要真正的实现功能,还是得需要用类来继承,Java中这个叫做实现(implements),当你这个类去实现这个接口的时候,实际上是接口给你一个引导方向,由类来实现功能,所以你需要覆写父类也就是接口的所有方法,想一想,如果你不去覆写方法的话,那你设定的这个类依旧是个抽象类,只能停留在概念上,而不能付诸行动。Java的类是单继承的,也就是说,一个子类只能继承自一个父类,而一个父类可以有多个子类。举生活中的例子就很好理解,一个爸爸可以生多个儿子,但是每个儿子在正常的情况下都是只能认准一个亲生父亲。接口的出现却打破了这种局面,一个类不允许继承多个类,但是一个接口却可以同时继承多个接口的。
我们再讲讲多线程,相信使用windows的用户对于进程一定不陌生,虽然进程和线程都和并发处理有关,但是多线程,多进程的使用环境不一样。多线程共享内存和数据,共享运行环境。多进程每个环境都根据需求独立享有内存和各自的环境。多线程让程序的效率变得更高,想一想,如果需要你左手画一个圆,右手画一个正方形,两只手同时进行,那么你要怎么做?恐怕两只手画出来的都不能让人满意吧,因为我们的思维决定了我们只能侧重于做一件事情,那么如果这样做呢,左边先画一段圆弧,右边再画一条直线,之后左边再画一段圆弧,右边再画,就这样交替进行,你发现完成到最后一笔的时候,你做到了!如果把画画这件事从宏观的角度上来看的话,看起来就像是左右手同时在进行一样,这就像是多线程的原理,画画这件事是进程的话,左右手做的事情就是线程做的事情,在同一时间段内我们同时进行了两个线程。在Java中只关心程序,而不会去关心程序具体是如何与底层交互的,所以我们简单理解一下线程就好。
当线程休眠的时候,我们不难可以想象,不是运行状态,就是阻塞状态。
Java不能像c语言一样取得地址,这样其实使Java变得更加安全,它只能用引用变量引用,hashcode存储的是当前变量引用的对象的地址,但这不是真实的内存地址,只是一个相关的数值。
我想有条理的再解释一下Java面向对象的三种特性——封装、继承、多态。类的封装性,用private关键字实现类的封装性,也就是让这个类加入私有的属性。类的继承用于扩展类的功能,子类继承自父类,拥有父类的一切,还可以自己构造自己的方法。多态(Polymorphism)顾名思义,意味着多种状态,不同的对象调用同一个方法产生了不同的结果。
这就是我对Java语言的一些小小的感悟,因为缺少代码的表现,可能我写的有一些空洞,也存在一些漏洞,但是我已经用自己的话表达出来了,学习一门程序设计语言远远不止于这些,只能通过大量的实践,在练习中理解。我会保持对Java的热情,继续学习下去。