1、单根继承结构
C++ 是支持多重继承的,常出现的问题是两个父类中含有同名的成员函数,子类继承这两个成员函数会有歧义性,简单的例子有菱形继承体系。java所有的类都继承自根类 Object
类,共享了同一接口,Object 类中的非 final 方法可以被子类覆盖(override),java类只能继承(extends)自一个父类,但可以实现(关键字 implements)多个 接口 (interface)。
C++ 实现多态的方式是虚函数与基类指针(或引用)可以指向子类对象。有的说法把函数重载理解为编译期多态,这是一种概念的推广 (
C++ 多态讨论)。java 实现多态的方式有类内的函数重载与 子类重写(重写和覆盖是相同的含义)父类方法 (
java多态讨论)。
2、容器与泛型
不同容器需要提供不同的外部接口,比如栈与队列的接口;不同容器具有相似的外部接口与行为,但对于操作具有不同效率。例如ArrarList 和LinkedList ,前者封装了连续数组,随机访问一个元素花费固定的时间,后者封装了双向链表,随机访问元素需要O(n) 时间。
在Java 5之前,容器存储的对象是Object 类型的,单根继承意味着所有对象都是 Object 类型的,容器可以存储任何对象(基本数据类型不是对象,包装类 Integer 可以存于容器)。容器中存放的是对象的引用,但引用放入容器时,必须
向上转型 ,把它取出时,获取的是 Object 引用,又必须
向下转型 。向上转型是安全的, 向下转型可能不安全。要保证向下转型的安全性,需要做类型检查。java 5引入了泛型机制,编译期可以根据 类型来创建容器,如 ArrayList<Shape> s=new ArrayList<Shape>();
注意 :容器不接受 int 等基本类型作参数,如 ArrayList <int> 是错误的,ArrayList <Integer> 才合法。
ArrayList中存放的是对象的引用,对象本身存放在虚拟机的堆中。Shape [] a 这样的数组存放的也是引用,int [] b 存放的才是值,前者默认每个元素初始化为null,即引用不指向任何对象。
3、java装箱机制
int等为基本数据类型,Integer为整数类,
装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型。
4、java有全局变量和全局函数吗?
C++ 中可以定义全局变量和全局函数,如果其他文件中也定义了同名的,为了避免冲突,引入了namespace,如std::sort 不会与vector::sort搞混。java所有的变量和方法都属于类,可以定义static变量,并赋予public访问权限,让其他类也可以修改此变量。
注意到C++ 中的struct 和联合也是公有访问权限,java也没有引入这两个数据结构。
5、java为安全做的努力
- 变量初始化更严格
C++ 全局变量的默认初始化是可预期的,局部int数组的初始化值未定义,string数组元素用string的默认构造函数初始化。而且编译器不会提示arr未初始化。int array[8]; int main() { int arr[2]; string strarr[2]; }
java局部变量未初始化会报错,如eclipse会提示。 类内的成员变量会提供默认值。( java变量初始化讨论)
-
C++对指针有效性和数组越界不作检查,这容易导致错误,也导致缓冲区的注入攻击成为可能,而java的变量初始化限制与边界检查能带来更安全的代码,避免程序员犯错。
6、java集合类详解
集合框架主要由Collection和Map两个根接口及其子接口、实现类组成。
zzhuwdjakdjk。