Java自学笔记(一)

      假期重新拾起Java来学,先是拿来《Think in Java》看,但不幸的是,那本书真心有点生涩乏味。于是上豆瓣寻找到一本李刚老师写的《疯狂Java讲义》,这几天看了一百来页,来总结总结。网上对于此书的评论,捧的大致上说这本书相对于国外教材来说,语言贴近中国人思维,容易理解,而且内容翔实;批的说这本书太罗嗦,让人捉不到重点。实际上,就我这几天的阅读看来,这本书是非常适合我的,在细节方面的解释,以及在底层原理的揭示,在我看来,正是学习一门新语言不可或缺的东西。
      对于像我这样从汇编语言和c语言这类底层语言学起的人,学习此类面向对象的语言时,我觉得可以沿着历史发展的角度去思考:当我们要编制更复杂的程序时,当我们需要良好的用户界面时,我们如何去利用面向对象语言的优势,来代替低级语言,去实现想要完成的功能?以“类”这个概念为例,为什么会有类?有类可以帮我们做什么?然后再去思考怎样去应用类。
      回想第一次学习Java时,大部分的时间是采用硬记的策略,这样一来学得枯燥,二来掌握得非常不扎实。所以在此提出对自己此次的希望:希望可以持续地思考,孜孜不倦地去深入理解Java,知其然,更要知其所以然,然后再会应用,自己开发项目。
      接下来开始总结的内容:


1.JVM。

首先来回忆一下c语言的运行过程。我们编写源程序*.c文件,然后用编译器如gcc编译,生成目标文件,再用连接器链接生成可执行文件如*.out,然后操作系统就可以直接去执行这个执行文件。像c语言这样的语言,称为编译型语言。这种我们很熟悉,那么还有什么类型的语言呢?解释型语言。解释型语言是使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行的语言,如Ruby,Python。解释型语言出现的原因就是实现跨平台,所谓跨平台其实就是比如你想写一个程序又想在Linux上跑,又想在Windows上跑,你又不想写两遍程序,那么只需要有针对两个平台的不同的解释器,那么你写一样的程序也可以在两个平台上跑。那么Java属于那一类呢?哪类都不是。Java首先也要经过编译(javac),但是编译完后生成的并不是特定平台上的机器码,而是一种与平台无关的字节码(*.class),然后用Java解释器来解释执行该字节码文件。而这里的Java解释器也就是Java虚拟机,即JVM。


2.为什么每个源文件里只能有一个public类,且文件名要与这个类名相同?

当我们在一个源文件中需要引用另外一个文件中的类时,我们应该怎样去找到这个类?难道还要进到文件里面去搜内容?很明显最快的方式就是搜文件名。


3.面向对象的思想。

在c语言中,我们面向的是过程,或者说是函数,过程是一个动态的动作,那么静态的状态由什么来表征呢?所以我们的类的定义=Field(状态数据)+方法(行为)。书上举了一个很好的例子:面向过程:吃(猪八戒,西瓜);面向对象:猪八戒(吃,西瓜)。这种主谓宾的关系更符合人类的思维,使程序的编制思路更加清晰。我们在观察这个世界时,会把很多具有共同特性的东西归为一类,这种方法其实是抽象的方法,比如当我们发现猫和狗都会哺育后代,所以我们有了哺乳动物这个类。反过来,当我们发现鸭嘴兽也哺乳时,我们可以把鸭嘴兽也归为这一类,此时鸭嘴兽作为哺乳动物这一类的具体的一个对象。这又是一种具象的方法。


4.System.out.println()。

这是Java中最常用的输出的函数,它和c语言中的printf有很大的不同。当printf想输出一个变量的值的时候,它基本上会这样:printf("I‘m %d years old",age);而方法println则不同,它大致会采用这样的语句:System.out.println("I‘m "+age+" years old");也就是说,在println方法中,变量是可以自动地转换为字符串的。


5.引用类型。

Java中没有指针,但是有引用类型,它本质上就是指针,只是用法略有不同而已,它实际上相当于把指针进行了一个封装。如果说b是a引用,那么b和a是由同一个指针指向的,b只不过是a的别名。引用类型包括类、接口、数组类型还有null类型。


6.数组。

数组类型是一种引用类型。数组关键是要掌握定义和初始化的意义。

数组的定义:type[] arrayname;

初始化:arrayName = new type[] {..,..,..};(静态初始化) 

arrayName = new type[length];(动态初始化) 。

数组引用变量只是一个引用(别名)。当我们定义一个数组时,实际上只是在栈内存中建立一个引用变量,但此时它引用的是什么却全然不知,所以必须还要有下一步,也就是初始化。初始化以后,堆内存中便开辟出了数组真正存储的空间。为什么要这样做呢?回想在c语言中,当我们定义一个数组时,其实也已经完成了它的初始化。而它的数组名,就是它的指针变量。如果我们把数组类型看成一个特殊的类,把一个数组看成一个特殊的对象,首先我们要知道,创建一个对象的成本通常是比较大的。所以当我们仅仅需要引用变量时,不需要在堆内存中创建与之对应的对象。所以,定义和初始化便被分开成为两步独立的步骤。当然,如果你想,也可以合成一步,像这样:

type[] arrayname = new type[] {..,..,..};

  


第一篇总结就到这里,欢迎指正、评论。

Java自学笔记(一),古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。