网站首页 > java教程 正文
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++指针和引用的区别:
引用是变量的别名,指针是变量的地址;引用不可独立存在,定义时必须初始化,指针则不是;引用在寿命期内不可在定义为其他变量的引用,而指针却可以指向其他变量;不能引用一个数组,但是有数组的指针;没有引用的引用,却有指针的指针。
猜你喜欢
- 2024-10-20 Java类的基本定义(java 类的)
- 2024-10-20 为什么说java是只有值传递?(为什么java只能单继承)
- 2024-10-20 作为测试人员,这些概念你不懂的话,你好意思说你懂Java?
- 2024-10-20 java基础学习笔记(四) - 深度解析八大基础类型
- 2024-10-20 尚学堂java学习笔记:Java各版本的含义
- 2024-10-20 java基础知识——什么是媒体?(解释什么叫媒体)
- 2024-10-20 三分钟学习Java泛型中T、E、K、V、?的含义
- 2024-10-20 吃人的那些 Java 名词:对象、引用、堆、栈
- 2024-10-20 什么是Java架构?(什么是JAVA架构师)
- 2024-10-20 「Java」详解常见的53个关键字(java详解)
你 发表评论:
欢迎- 07-21如何将 iPhone 中的联系人导出到 Excel/CSV?
- 07-21sql查询的字段数据中有逗号。放到csv文件会分开,如何解决?
- 07-21在 WebAPI 里生成 csv zip 文件(webapi怎么发布在iis上)
- 07-21如何把csv格式转换成Excel格式(csv格式怎么转换)
- 07-21如何将高程导出为XYZ或CSV高程点(如何将高程数据导入cad)
- 07-21使用python把csv汇总成excel(python怎么将csv文件中的列存入列表)
- 07-21解决PHP导出CSV文件中文乱码问题(php导出excel文件)
- 07-21使用vba将Excel 文件转成 CSV 文件
- 最近发表
-
- 如何将 iPhone 中的联系人导出到 Excel/CSV?
- sql查询的字段数据中有逗号。放到csv文件会分开,如何解决?
- 在 WebAPI 里生成 csv zip 文件(webapi怎么发布在iis上)
- 如何把csv格式转换成Excel格式(csv格式怎么转换)
- 如何将高程导出为XYZ或CSV高程点(如何将高程数据导入cad)
- 使用python把csv汇总成excel(python怎么将csv文件中的列存入列表)
- 解决PHP导出CSV文件中文乱码问题(php导出excel文件)
- 使用vba将Excel 文件转成 CSV 文件
- python爬虫25 | 爬取的数据怎么保存?CSV了解一下
- MySQL 导出数据(mysql 导出数据 判断成功)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)