一、 变量的定义和缺省初始化
c++ 中声明变量的时候大多的进行了定义(即分配了内存),特例有:
1) extent int x,仅仅声明了x,没有为x分配内存。
2) 函数的声明(即在调用函数之前进行的声明,此时未定义)。
3) 类的声明。
java中 方法中的变量在声明时没有初始化,有些人以为会被初始化为null,其实不是.不初始化的话,编译器会报错的.直到被赋值或者被调用。
成员变量则在声明时候被初始化,初始化成一个默认值.比如整数为0,对象则被初始化为null。
C++中基本类型的数据,只在全局的时候才进行缺省初始化
二、 static
由于C++中static的含义要比java广的多。static变量本身有种“共享”的属性,并且共享它的“用户”的权限都是可读可写。其中若有一位改变了它的值,其他的“用户”也只能接受这种改变。对于C++来说:
1) 全局静态变量或者局部静态变量可以让它们相应作用域中的“用户”来使用;
2) 类中的静态成员变量和静态成员函数可以用类名访问或者用对象访问(如果权限允许的话),而且其静态成员变量仅能在类外初始化:
variable_type CLASSNAME:: variable_name = value。
对于java而言,因为java严格遵守oop的思想,static仅体现在类的成员变量和方法上。用法同2),但是其初始化可以在类内部完成。
三、 作用域
C++允许在一个块(block)的子块中定义与此块中相同的变量名,并且子块变量中完全覆盖父块的变量。JAVA是不允许的 。
四、 运算符重载
java 并没有像C++那样提供运算符重载功能,因此java里用“==”判断字符串相等不再实用(此时的“==”只是表示位置的相同, 虽然位置相同的字符串一定相同,但是值相同的字符串未必在同一位置),此时需要用方法equals(String str)。
五、 功能强大的 “for each”循环
java中有这样的for循环语句:
for(element:collection)
其中collection 是实现了interable接口的集合,C++中则没有此语句。
六、 对象赋值引用
此处是最容易忽视的,也是最严重的区别,Test.java文件中有如下代码:
public class Test
{
public Test(int value)
{
this.value = value;
}
public void print()
{
System.out.println(value);
}
public void setValue(int value)
{
this.value = value;
}
private int value;
public static void main(String args[])
{
Test test1 = new Test(1);
Test test2 = test1;
test2.setValue(2);
test1.print();
}
}
此时,输出为2。可见java中的对象间"="操作相等于C++中"&"(引用)一样,C++对象的"="操作实际上是拷贝操作,相当于JAVA中的clone(Object other)方法。而对于数组,JAVA中也将之作为对象看待,比如如下语句:
int[] intArr = {1,2,3};
int[] intArr2 = intArr;
intArr2[0] = 3;
System.out.println(intArr[0]);
输出值为3。
七、 默认的动态绑定
JAVA中子类会自动覆盖父类的同名方法,而不用像C++,将父类方法声明为vitual型。如果不想让子类覆盖,应该实用final修饰。也就是说:C++默认是不覆盖的,要覆盖需要主动说明;而JAVA默认是覆盖的,要取消覆盖需要主动说明。
八、 多重继承与接口
多重继承(Multiple inherit)容易带来歧义和重复继承,远比单一继承复杂。JAVA声称自己并不支持多重继承,但是它巧妙地利用了接口(interface)的概念,实现了多重继承的功能,实际上C++中在多重继承时也经常使用无成员变量的虚拟基类(abstract class)这实际上相当于JAVA中的接口。形象地说,JAVA中的接口更像是一种“规则”。比如Comparable 接口,所有要实现比较对象操作的类都得遵守Comparable的规则,即要实现CompareTo方法。而多重继承中的父类不仅仅是实现定义规则的功能,还提供一些数据和方法。
九、 C++中的嵌套类和java中的内部类
C++中嵌套类相当于“局部类”,相当于局部变量,可以解决名字冲突和访问控制。java中的内部类则远比C++复杂,由于java并没有变量覆盖的概念(参见第三条),所以内部类的设计初衷就与C++的嵌套类有很大区别。其功能如下:
1) 内部类可以方便地访问其外部类的任何成员(如同外部类的方法)。
2) 内部类可以用private来修饰,此时仅有外部类可以创建其实例。
(待续)
十、JAVA函数参数传值调用,参数如果是基本类型,参数本身不可变;如果是对象引用,引用不可以指向新的对象。
这里有三个原则:
1、对于基本类型的参数,函数不能改变其值
2、对于对象引用参数,函数不能其引用目标
3、对于对象引用参数,函数可以改变其引用对象的状态
因此,在C++里可行的swap(T& t1, T& t2)(或者swap(T *pt1,T *pt2))函数,在C++里是做不到的。要想交换两个变量的值,除非将他们放入一个类,然后用上面的第三种方法来交换。
如下:
class Test
{
public int i0 = 0;
public int i1 = 1;
}
swap(Test t)
{
int tem = t.i0;
t.i0 = t.i1;
t.i1 = tem;
}