1、JAVA中的移位操作符
JAVA中,>>>运算符将用0填充前面的位,>>运算符将用符号位填充左侧的位。没有<<<运算符。
对于移位运算符右侧的参数需要进行模32的运算,除非左边的操作数是long类型,在这种情况下右侧的数需要模64。
而在C++中,无法确定>>操作执行的是算术位移(扩展符号位),还是逻辑移位(高位填0)。在执行中,只会选择效率较高的一种。这就是说,在C++中,>>运算符其实只是为非负数定义的。JAVA消除了这种含糊性。
2、强制类型转化
C++注意:在Java中不能在boolean类型与任何数值类型之间进行强制类型转化,这样可以防止一些常见的错误发生。
java中不使用逗号运算符。不过,可以在for语句中使用逗号分隔表达式列表。
3、String类
由于不能修改java字符串中的字符,所以在java文档中将String类对象称为 不可变字符串。
可以使用equals方法检测两个字符串是否相等。
要检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。
一定不能使用“==”运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否被放置在同一个位置。
4、当使用的类不是定义在基本的java.lang包中时,一定要使用import指示字将相应的包加载进来。
5、块作用域:
java中不能在嵌套的两个块中声明同名的变量。
C++注意:在C++中,可以在嵌套的两个块中重定义一个变量。在内层定义的变量会覆盖在外层定义的变量。
6、final实例域
可以将实例域定义为final。构建对象时必须初始化这样的域,必须保证在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能再对它进行修改。
7、静态域和静态方法
如果将域定义为static,那么每个类中只有一个这样的域。而每个对象对于所有的实例域却都有自己的一个拷贝。
可以认为静态方法是没有this参数的方法。(在一个非静态的方法中,this参数表示该方法的隐式参数)因为静态方法不能操作对象,所以不能在静态方法中访问实例域。但是,静态方法可以访问自身类中的静态域。
注意:可以使用对象调用静态方法,但习惯上,使用类名来调用静态方法。
在下面的两种情况下使用静态方法:
(1)当一个方法不需要访问对象状态,其所需要参数都是通过显式参数提供的(例如:MAth.pow).
(2)当一个方法只需要访问类的静态域(例如Employee.getNextId)
每个类可以有一个main方法。这是对类进行单元测试事的一个常用的技巧。
6、循环语句
在循环语句中,检测两个浮点数是否相等需要特别小心。
当在for语句的第1部分声明了一个变量之后,这个变量的作用域就为for循环的整个循环体。
在switch-case语句中case后面只能跟 常量或枚举类型常量,不能检测字符串。
在Java中可以使用类似于goto语句的带标签的break语句,使用时必须在循环体之前声明标签,同时加上冒号。
7、大数值
在java中java.math包中提供了两个很有用的类:BigInteger和BigDecimal,分别表示任意大小的整数和浮点数。
8、特殊的循环语句“for each“语句
语法格式:
for( variable : collection ) statement
"for each"语句的循环变量将遍历数组中的每个元素,而不需要使用下标值。
9、数组
数组的初始化:
int[] smallPrimes={2,3,5,7,11,13};
匿名数组:
new int[]{17,19,23,19,31};使用这种形式语法可以在不创建新变量的前提下重新初始化一个数组。
在java中,允许数组的长度为0。如: new elementType[0];
注意:数组长度为0,与null不同。
允许将一个数组变量拷贝到另一个数组变量。这时,两个变量将引用同一个数组:
int[] luckyNumbers=smallPrimes;
C++注意:java数组与C++数组在堆栈上有很大的不同,不过基本上与分配在堆上的数组指针一样。
也就是:
int[] a=new int[100];
不同于
int a[100];
而等同于
int* a=new int[100];
java中的[]运算符被预定义为检查数组边界,而且没有指针运算,即不能通过a加1得到数组的下一个元素。
10、CommandLine
C++注意:在java应用程序的main方法中,程序名并没有存储在args数组中。而C++中的程序名是存储在argv[0]中的。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~··
对象与类:
1、一定要认识到一点:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。在java中任何对象变量的值都是对存储在另一处的一个对象的引用。new操作符的返回值也是一个引用。
可以将java的对象变量看做C++的对象指针。所以java中的null引用相当于C++中的NULL指针。在C++中通过拷贝构造函数和复制操作符来实现对象的自动拷贝。但在java中,必须使用clone方法来获得对象的完整拷贝。
2、对实例域做出修改的方法被称为 更改器方法 ,仅访问实例域而不加修改的方法被称为 访问器方法。
C++注意:在C++中,带有const后缀的方法表明是访问器方法;否则,默认是更改其方法。在java中没有明显的区别。但在习惯上,在访问器方法名称前面加上前缀get,在更改器方法前面加上前缀set。
3、可以认为java内置了“make”功能。
4、构造器函数
C++注意:java构造器的工作方式和C++是一样的。但是,java对象都是在堆中构造的,构造器总是伴随着new操作符一起使用。
注意:不要在构造器中定义与实例域重名的局部变量。
在每个方法中关键字this表示隐式参数。
C++注意:在C++中类的方法一般都定义在类的外面,如果在类的内部定义方法,那么这个方法就自动地成为内联(inline)方法。而java中,所有的方法都必须在类的内部定义,但并不表示它们是内敛方法。是否将某个方法设置为内联方法是java虚拟机的任务。
5、提示:注意不要编写返回引用可变对象的访问器方法。如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象的克隆是指存放在另一个位置上的对象副本。
6、基于类的访问权限
C++注意:java和C++一样,类的方法可以访问所属类的私有特性(feature),而不仅限于访问隐式参数的私有特性。
7、方法参数
java对对象采用的不是引用调用,实际上,对象引用进行的是 值传递。
下面总结一下在java程序设计语言中,方法参数使用的情况:
(1)一个方法不能修改一个基本数据类型的参数(即数值类型和布尔类型)
(2)一个方法可以改变一个对象参数的状态。
(3)一个方法不能让对象参数引用一个新的对象。
C++注意:C++有值传递和引用传递。
8、一些基本的库函数和包
java.utils.Random
--Random():构造一个新的随机数生成器。
--int nextInt(int n):返回一个0~n-1之间的随机数
9、对象构造
要完整的描述一个方法,需要指出方法名以及参数类型。这叫做方法的签名(signature)。返回类型不是签名的一部分。也就是说,不能有两个名字相同、参数类型也相同却返回不同类型值的方法。
如果没有初始化类中的域,将会被初始化为默认值(0,false,null)
如果类中提供了至少一个构造器,但是没有提供默认的构造器,那么在构造对象时若不提供构造参数就被视为不合法。
可以再类的定义中,简单地讲一个值赋给任何域。
C++注意:在c++中,不能直接初始化实例域。所有的域必须在构造器中设置。但是,有一个特殊的初始化器列表语法。
在java中,this引用等价于C++的this指针。但是,在C++中,一个构造器不能调用另一个构造器。在C++中,必须将公共出初始化代码编写成一个独立的方法。
java中调用构造器的具体处理步骤:
(1)所有的数据域被初始化为默认值(0,false,null)
(2)按照在类声明中出现的次序执行所有域初始化语句和初始化块
(3)如果构造器第一行调用了第二个构造器,则执行第二个构造器主体。
(4)执行这个构造器的主体
这里初始化块包括 对象初始化块 和 静态初始化块。
由于java有自动的垃圾回收器,不需要人工回收内存,所以java不支持析构器。可以为任何一个类添加finalize方法。finalize方法将在垃圾回收器清除对象之前调用。在实际应用中,不要使用finalize方法回收任何短缺资源,因为很难知道这个方法什么时候被调用。
10、包
需要注意,编译器对(带有文件分隔符和扩展名.java的)文件进行操作。而java解释器加载类(带有.分隔符)