JAVA快速入门
本文假定读者已经有较好的C++基础。并将本着“从C++过渡到JAVA”的想法,对比C++和Java 中的功能异同
C++的教材则是数不胜数,推荐一个在线站点http://prglab.com/
1.程序结构
----------------------
一个C++程序首先由若干include和define开始,表示包含的头文件和宏定义。所有程序都从main函数开始。一个函数有返回值,形参列表和函数名函数体。
一个JAVA程序由若干个import 语句开始,稍后详述JAVA中所有的函数或者说方法都被放在类中。当然整个工程中只能有一个main函数。每个函数必须声明其访问权限public,private或者privated.其他相同
----------------------
C++支持/**/和//注释,JAVA一样。但是JAVA中因为强调了“包”的概念,就是程序员可以把若干类封装成一个包发布,通过import关键字使用,JAVA特地引进了注释文档特性。如果在一个public或者protected成员的上一行写注释,在调用这个类的时候就能看到注释,这个特性可以很方便地写一些类说明。注释说明支持富文本标记,可以用@see标记引用其他类文档,用@version和@author说明版本和作者,用@param 参数名 说明 来标注形参列表,@return 说明 来标注返回值信息,@exception 类名 说明 来标注意外情况的处理类 @deprecated表示这个方法即将过期或在未来版本中取消而不建议使用,如果使用这个方法,编译器报warning。
----------------------
基本数据类型是相同的。但是常见的数据类型被JAVA定义为主类型。这些是有实体的。而其他(比如类的实例)在JAVA中都是以引用的形式存在的。之所以主类型不是引用是出于速度考虑。JAVA也有同样的static静态变量和函数机制。
JAVA不允许全局变量(因为所有东西都应该在某个类的内部),但数据可以作为类成员存在,而且可以自定义初始化。只要将初始化语句用{}括起来就行了。
操作符、类型强制转换也一样,但是JAVA没有sizeof,因为所有类型的机器字节数都一样,Java的bool类型只能是true和false,不能像C++那样是01值还能参与int运算。
----------------------
2.控制结构和函数
一模一样
3.数组
稍微不同。比如int[] a可以声明一个int数组。在C++中,数组必须有个容量,否则容易出错。但是JAVA中,这样只是声明了一个数组的引用(可以认为是C++中的数组头指针),而数组容量可以动态说明。比如a=new int[pRand(20)]。我们知道这在C++中很难。这得意于java的堆机制。可以随意分配空间。可以用int[][][] a=new int[2][2][4]定义三维数组。初始化什么的则和C++一样。
4.面向对象
如前面所说,JAVA的类成员有三种访问权限,有和C++一样的构造函数和重载机制。注意java的类也有访问权限。
----------------------
JAVA强调包的概念,所以这一部分很恶心。要了解这个概念还要先看看JAVA的编译机制:
每个.java文件称做一个编辑单元,他有且只有一个public类,且名字必须和该文件名一样。编译时将为每个类生成一个.class文件。要想在其他文件中使用这些类(当然只有public类能够正确被使用)必须声明一个package,文法是在.java文件的第一行表明package packageName; 一个包可能会有多个public类,但是只有public类会被包括在包中,私有类只有它所在的.java文件中的其他类可以访问。
如何有效管理包名称呢,Java 鼓励“反转域名”的方法,因为域名是独一无二的,将域名反过来就保证包名是独特的。比如java.org那个包名就可以用org.java开头。但是要注意包名字中的 . 对应了目录的层次。机理是,Java 编译器会先读取系统环境变量中的CLASSPATH,该环境变量有若干个路径,编译器将在各个路径下搜索org/java目录。例如一个.java文件如果声明了他的public类在org.java.util包中,就要在某个环境变量中登记的路径下的org/java/util目录中放置该java文件。
----------------------
作为面向对象语言,JAVA理所当然有继承机制。继承的写法是class XXX extends XXX,如果基类的构造函数要求参数,需要在继承类的构造函数第一行用super关键字+参数对基类初始化。
class Fork extends Utensil {
Fork(int i) {
super(i);
System.out.println("Fork constructor");
}
}
JAVA也有所谓过载和覆盖,即子类可以改变父类的一个方法的返回值或者形参列表实现过载,或者重写一个和父类方法一样的函数实现覆盖。和C++的const关键字对应的final关键字可以禁止覆盖或更改,Java 沿用了static关键字。和C++的虚函数的virtual关键字对应的就是abstract关键字,该关键字可以放在class 前面声明一个虚类。此外Java 提供了interface 关键字,将一个类声明为interface 而非class ,表示其内部所有成员都默认有static和final关键字,而且接口成员默认访问属性都是public。实现一个接口不用extends而用implements关键字。实现后的接口如果不表明权限将默认为protected 。如果对接口使用extends将生成一个新的接口。接口中的数据成员支持初始化,因为他们说白了就是static final而已。
-----------------------
Java 支持多重继承,但是简化了逻辑,即java只允许从一个class和若干个接口进行多重继承
interface CanFight {
void fight();
}
interface CanSwim {
void swim();
}
interface CanFly {
void fly();
}
class ActionCharacter {
public void fight() {}
}
class Hero extends ActionCharacter
implements CanFight, CanSwim, CanFly {
public void swim() {}
public void fly() {}
}
--------------------------
Java 的内部类机制允许把类放在任意作用域内:类的内部或者一个方法的内部。优点就是可以用这个类帮助解决问题,而将他声明为private可以完全禁止作用域外的访问。或者某些方法可以返回一些内部类的句柄,因为外部不能对这些内部类操作,可以实现一种接口的功能或者说数据保密(类似于一种独立文件格式的作用)。
写到这里我表示严重不推荐《Thinking in Java》这本书,任意版本都不推荐。这本书废话多结构凌乱,如果没底子很容易被这本书彻底带晕。