Java中的所有函数都属于某个类的方法。因此,Java中的main方法必须有一个外壳类。
Java中的main方法必须是静态的。
public class ClassName { public static void main(String[] args) { program statements } }
Java是可移植的,它的数据类型所占空间是固定的。
整形:int 4字节,short 2字节,long 8字节,byte 1字节
long型数值有一个后缀L,十六进制数值有一个前缀0x。
Java没有unsigned类型
浮点型:float 4字节 6~7位有效数,double 8字节 15位有效数
float类型的数值有一个后缀F,没有后缀的默认为double
在C++中,数值或指针可代替boolean值,0相当于false,非0相当于true,在Java中则不行。
C和C++区分变量的声明和定义,例如 int i=10;是定义一个变量,而 extern int i;是声明一个变量,Java不区分变量的声明与定义。
Java使用关键字final定义常量,与C++中的const类似。
对于布尔值,&&和||按短路方式进行计算,即如果第一个表达式就能得出结果,就不必算第二个表达式了,而&和|则不按短路方式进行计算。
>>运算符用符号位填充左侧的位,>>>运算符用0填充左侧的位。
算数运算时:
如果两个操作数中有一个是double类型的,那么另一个操作数将会转换为double类型;
否则,如果其中一个操作数是float类型的,那么另一个操作数将会转换为float类型;
否则,如果其中一个操作数是long类型的,那么另一个操作数将会转换为long类型;
否则,两个操作数都将被转换为int类型。
强制将浮点数转换为整数,会将浮点数的小数部分截断。如果想进行舍入运算,就要用Math.round方法
double x=9.997;
int nx=(int)Math.round(x);//round返回的是long类型
Java的String类不能像C++中那样修改某个位置的字符,但可以改变字符串变量的内容,即重新赋值。
Java:String greeting = "Hello";
C++:char *greeting = "Hello";
以上二者是类似的。
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。例如:
int age=13;
String rating="PG" + age;
rating得到"PG13"。
Java中不能使用==来判断两个字符串是否相等,它只是判断两个字符串是否被放在同一位置。
使用equals判断两个字符串是否相等:
判断字符串s与t是否相等:s.equals(t);相等则返回true。这里s和t可以是字符串变量或者字符串常量,如:"Hello".equals(greeting);
大数值
如果基本的整数和浮点数精度不能满足需求,就可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。
使用静态的valueOf方法可以把普通的数值转换为大数值:
BigInteger a = BigInteger.valueOf(100);
可惜的是,不能使用人们熟悉的运算符(如+和*)处理大数值,而需要使用大数值类中的add和multiply方法。
BigInteger c = a.add(b); //c = a+b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))); //d=c*(b+2)
注意:Java没有提供运算符重载功能。
BigInteger add(BigInteger other)
BigInteger subtract(BigInteger other)
BigInteger multiply(BigInteger other)
BigInteger divide(BigInteger other)
BigInteger mod(BigInteger other)
int compareTo(BigInteger other)
如果这个大整数与另一个大整数相等,则返回0;如果小于另一个大整数,则返回负数;如果大于另一个大整数,则返回正数。
static BigInteger valueOf(long x)
返回值等于x的大整数。
BigDecimal与BigInteger有类似的成员方法,特别的是:
static BigDecimal valueOf(long x) //返回值为x的一个大小数
static BigDecimal valueOf(long x,int scale) //返回值为x/10^scale的一个大小数
数组
int[] a和int a[]都可以声明数组,在Java中,int[] a更常用。
要把a初始化为一个真正的数组,要使用new运算符:int[] a = new int[100];
a.length返回数组元素的个数。
Java中的数组与C++中分配在堆上的数组指针类似,但没有指针运算,即不能通过a加1得到数组的下一个元素。不过Java中的[]运算符可以检查数组边界。如果越界会抛出"array index out of bounds"异常。
初始化数组也可以使用与C++类似的方法:int[] a={2,3,4,7}
Java允许将一个数组变量拷贝给另外一个数组变量,这时,两个变量将引用同一个数组,这与C++中的数组指针的性质类似。
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12;//now smallPrimes[5] is also 12
如果希望将一个数组的所有值拷贝到另一个数组中去,就要使用System类的arraycopy方法:System.arraycopy(from,fromIndex,to,toIndex,count);
数组to必须有足够的空间来存放拷贝的元素。
数组排序可以使用Arrays类中的sort方法,这个方法使用优化的快速排序算法。
int[] a = new int[100];
...
Arrays.sort(a);
数组比较可以使用Arrays类中的equals方法:
static boolean equals(type[] a,type[] b)
type为int,long,short,char,byte,boolean,float,double
二维数组
double[][] balances;
初始化:
balances = new double[NYEARS][NRATES];
或者
int[][] magicSquare =
{
{16,3,2,13},
{5,10,11,8}
};
double[][] balances = new double[10][6];//Java
类似于C++中
double **balances = new double*[10];
for(int i=0;i<10;i++)
balances[i] = new double[6]
命令行参数
String[] args存放命令行参数,与C++不同的是,args[0]并不存放程序名,而是存放第一个参数。