30 November 2013

这篇博客开篇先讲讲《Java编程思想》(Thinking in Java)这本书,已经看过了一部分,发现此书讲的东西很深,如果是新手,绝对是要晕头转向。当然你会说:“好像你已经是个老手了?!”其实我这么说也有根据,请看此书的目录:

第1章 对象导论                      
第2章 一切都是对象					  
第3章 操作符 						  
第4章 控制执行流程                   
第5章 初始化与清理                   
第6章 访问权限控制					  
第7章 复用类                        
第8章 多态                          
第9章 接口                          
第10章 内部类 					   
第11章 持有对象					   
第12章 通过异常处理错误			       
第13章 字符串                        
第14章 类型信息                      
第15章 泛型 					       
第16章 数组                         
第17章 容器深入研究                   
第18章 Java I/O系统                 
第19章 枚举类型
第20章 注解
第21章 并发
第22章 图形化用户界面

下边是《C++primer》的目录:

第1章 快速入门
第2章 变量和基本类型
第3章 标准库类型
第4章 数组和指针
第5章 表达式
第6章 语句
第7章 函数
第8章 标准IO库
第9章 顺序容器
第10章 关联容器
第11章 泛型算法
第12章 类
第13章 复制控制
第14章 重载操作符与转换
第15章 面向对象编程
第16章 模板与泛型编程
第17章 用于大型程序的工具
第18章 特殊工具与技术

明显《C++primer》的顺序对新手更“有爱”一些,而不是像上面那样上来就是狂轰烂炸式的“面向对象”。从我个人的阅读经验来说,《Java编程思想》有很多思想非常深刻,需要反复思考和练习,且对面向对象思想讲解更透彻(个人想法)。幸亏自己有一定的经验,否则真的有点寸步难行。新手学此书,或者有天赋,或者有自虐倾向(有其他语言编程经验的不算在此)。要想一个礼拜学会Java,估计这本书够呛。兄台,想速成,学Python啊:)。(个人感觉Python的基本语法门槛比较低)。

先说说static关键字。学过C语言的都知道这个静态定义,可其实这个关键字的用法讲究的很,不是一两句就能说完的。书中假设了如下两种情况:

  • 只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不创建任何对象。
  • 希望某个方法不与它的类的任何对象关联在一起。也就是说,即使没有创建对象,也可以调用这个方法。

举例:

class StaticTest {
	static int i = 47;
}

//创建
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
//使用
st1.i = 10;
st2.i = 20;
StaticTest.i++;

这里即便创建了两个对象,这两个对象也共享一个i值。即st1.i = 10后,st2.i的值也为10,改为20后,st1.i也为20。最后一行是静态类型的特殊用法,即不创建任何用法而使用这个变量。这时,st1和st2的i值都自加1(其实这么说不准确,其实是共享的i自加1)。

上例其实就是说了两种情况的第一种情况,来说说第二种情况:不创建对象直接调用方法。

class Incrementable {
	static void increment() {
		StaticTest.i++;
    }
}

//通过对象调用
Incrementable sf = new Incrementable();
sf.increment();
//直接调用
IncrementableIn.increment();

第一种很常见,第二种直接调用比较特殊,即不通过创建对象,直接调用方法。

其实static还有其他需要注意的地方,后面遇到了再说。

创建第一个Java程序,其实从零学Java的第一篇就有一个例程,我们直接拿来用:

public class Hello
{
    public static void main(String args[])
    {
        System.out.println("Hello World!!");
    }
}

public指明该方法可以被外部调用。Hello这个类中仅仅有一个方法,即main。由于main是静态类型,故不需要创建对象即可运行。那么这段代码到底如何运行的?以下是个人猜测,等待验证:Java虚拟机首先需要找到Hello这个类,为什么不是别的类?之前(第一篇)我们说过,需要给这个Java文件命名为Hello.java,正是根据这个文件名,虚拟机去寻找这个类。找到Hello这个类后,虚拟机进而寻找主方法,即main。就像C/C++一样,以main为起始点运行。由于主方法的运行没有建立在任何对象的创建基础上,故需要static定义。主方法的参数是一个String类的数组(要求必须这样写)。

System.out.println(“Hello World!!”)很好理解,OOP一看到“点”基本上就是调用对象的方法或变量。这里要多说两句,加载其他已定义好的类用import关键字,这里尽管没有import任何类,但是一个特定的类会被导入每一个Java文件,即java.lang。突然想起来以前在windows下使用Racket编写scheme,还好奇为什么第一行需要加上一句#lang racket,可能就是加载某种模块,估计lang这个词和默认加载的类有关(可能是俗称规定)。

根据第一篇所讲,运行后会生成Hello.class(无论是集成环境还是javac),Java编译器(Java虚拟机的一种提升速度的方法)先把源代码编译成.class文件,当需要加载某个类时,编译器先去找对应的.class文件,然后把它装入内存,再运行。

ok,这就是第一个Java程序的整个流程了。

最后简单说一下注释和文档的问题,注释与C/C++基本相同,但是Java的文档(使用Javadoc)真的很强大,它不与代码分离,而是和代码写在一起。怎么理解?看下面的例子:

文档注释要正好放到定义之前。如果是集成环境,用鼠标在类前后左右晃一晃,就能显示出该类的文档了。如果要添加作者、版本等其他信息,可以使用标签,在此不多介绍。文档还可以导出成html格式,非常方便。



blog comments powered by Disqus