java

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 s=new ArrayList();
注意 :容器不接受 int 等基本类型作参数,如 ArrayList 是错误的,ArrayList 才合法。
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为安全做的努力

变量初始化更严格
int array[8];
int main()
{
int arr[2];
string strarr[2];
}
C++ 全局变量的默认初始化是可预期的,局部int数组的初始化值未定义,string数组元素用string的默认构造函数初始化。而且编译器不会提示arr未初始化。
java局部变量未初始化会报错,如eclipse会提示。 类内的成员变量会提供默认值。(java变量初始化讨论)

C++对指针有效性和数组越界不作检查,这容易导致错误,也导致缓冲区的注入攻击成为可能,而java的变量初始化限制与边界检查能带来更安全的代码,避免程序员犯错。

zzhuwdjakdjk。

posted @ 2017-08-23 15:47  hchacha  阅读(157)  评论(0)    收藏  举报