Java中为什么没有指针?
我们都知道Java与c/c++有个显著的区别就是c/c++有指针的使用,而Java中没有用到指针。之所以Java没有指针的使用(没有显示的使用指针,内部实现机制肯定是有指针的),是因为Java作为一个纯面向对象的语言,程序员基本不用关心内存的分配与释放,这些操作都被虚拟机拿去做了,如果说虚拟机已经可以帮助实现,同时指针操作由人操作是容易造成重大错误的,因此没有必要引入指针操作。
什么是Java的对象引用和对象?
这一问题,很多书上都没有解释清楚甚至有的书省略了,理解这个对于学习Java而言非常的重要。
比如说:
Student a=new Student("小明");
这里的a就是一个Student对象的引用,是一个引用,而这里的new Student("小明")实际上是一个对象,也就是说这个表达式是表示:对象的引用a指向创建的对象new Student("小明")。
在Java中都是通过引用来操作对象的。如果一个对象被多个引用变量引用,则引用变量将共同影响这个变量本身。同样,一个引用变量也可以志向不同的对象,但是同一时刻下只能指向一个对象。
Java中的对象和C++中的对象有什么区别?
首先就存储位置而言。Java中的基本数据类型变量和引用变量是存放在栈中(生命周期很短),而创建的对象则是放在堆中(生命周期长),由于创建对象要调用构造器会比较费开销,放在不易销毁的堆中等需要被引用变量引用时再拿出来用。C++中new后的对象一样也是在堆中存放。
下面看两个个例子:
// Java创建对象的存储方式
Student a; // 这个引用变量存放在栈中,是一个空引用,没有在栈中开辟Student的空间
a=new Student(); // 栈中的引用变量指向了在堆中开辟实际空间的Student对象
// C++创建对象的存储方式
Student A; // 这个Student类型的变量A在栈中创建,并且还在栈中给其分配了Student大小的空间
Student *a; // 这个指针变量本身存的是地址,存储在栈中
a=new Student(); // 在堆中申请空间,过后需要手动释放
其次就创建方式而言。Java中万物皆对象,而Java中都是通过引用来操作对象的,Java是区分值类型和引用类型,用户自定义的类型都是引用类型,而值类型和引用类型在很多地方不可混用(比如说为什么非要包装类),Java 的引用更像是C++的指针。C++可不是万物皆对象,即使他有着面向对象的思想,C++可没有引用类型和值类型的概念,C++有普通类型和指针类型。
再次就访问控制级别而言,二者都有public,protected,private三级访问控制级别,Java还有default包访问控制级别,C++有友元继承。
还有就基类而言,Java根基类是Object,C++没有根基类。
然后就析构而言,C++有析构函数,Java中没有析构方法,有一个终结的方法,因为有gc。能自己手动析构,所以C++才没有什么finally,而Java会有。
再然后就泛型而言,C++模板采用代码生成技术,运行时保留泛型信息,而Java采用类擦除技术,类型信息在运行时就没了,实质上是自动进行了类型的转化。
最后可以说C++代码运行非常依赖于程序员的编写操作,而Java代码的运行更依赖于虚拟机的操作。当然还有其他不同,暂未列出。
C++既然有指针为什么还要引用?C++指针类型和引用的区别?
C++还需引用的原因:
C++的指针其实是很危险的东西,但却无比的灵活,之所以有了指针却还要引用的原因是C++中有一个叫运算符重载的东西。(运算符重载往后的博文会写到)
C++指针和引用的区别:
引用是变量的别名,指针是变量的地址;引用不可独立存在,定义时必须初始化,指针则不是;引用在寿命期内不可在定义为其他变量的引用,而指针却可以指向其他变量;不能引用一个数组,但是有数组的指针;没有引用的引用,却有指针的指针。