大家好,今天小编关注到一个比较有意思的话题,就是关于java语言不允许用指针体现了的问题,于是小编就整理了4个相关介绍Java语言不允许用指针体现了的解答,让我们一起看看吧。
为什么JAVA自带的一些工具类不使用c语言来写
首先,j***a语言要在很多平台上运行,用c语言写的话,你得每个平台都编译一次,每个平台都要对应优化,麻不麻烦,而且产生不同的好几个库,增大运行时体积。
第二,并不是说c语言写就一定好,用c写很考验程序员的编程水平,作为一个工具类,就要追求性能,考虑内存、指针、代码优化等等复杂问题。而目前jit的优化功能已经非常强大了,在很多情况下运行速度与c语言相差无几。
第三,这些代码都要被用户的j***a代码调用,如果要在c实现那么这些工具类就必须要弄一套jni调用,会增加不必要的运行时开销,代码复杂度增加。另外如果要在c实现,那就意味着放弃了已经写好的j***a优良特点不用,捡了芝麻丢了西瓜,例如垃圾回收,异常捕捉等非常方便的特性。
第四,方便调试,设想,***如工具类是用c写的,一个j***a程序员调用这个库,结果出异常了,你得从j***a调试器换到支持c的调试器,例如gdb,lldb等等,然后学习怎么调试,找c里面的bug,这对于一个j***a程序员来说,是非常痛苦的。而用如果j***a写的话直接就可以调试,并且可以使用j***a的异常机制。
如果你j***a和c都会那当然是可以,如果不会c那就还是老老实实玩j***a把,就说一点,调用的C肯定编译后的,逻辑肯定看不了,报个错,你不得当场去世,要简单拓展一下,也是当场懵逼,j***a写你好歹能看懂一点,这个方式是可行的,但并不适合只会j***a的程序员
为什么别的语言中没有像C语言一样有指针?
可以直接使用指针的语言有C和C++,其它语言其实也会用到指针,只是对指针进行了封装。
为什么不能使用指针呢,因为指针是直接对内存地址进行操作,如果该地址是一个非法地址,很容易造成程序崩溃!比如突然蓝屏。其它语言对指针进行封装保护后,你只能通过其提供的方法进行内存访问,地址由系统进行管理,不容易出现风险。
其实,如果你能熟练运用指针,你会发现真的很方便,如果你还需要控制硬件,那真的是最高效的方法了。这也是为什么C/C++更适用于低层编程的语言。
真正对应硬件的操作,怕指针是因为后来的程序员们不需要直接面对CPU和内存了,不需要再玩CPU的汇编了,而早期的程序员们甚至需要用拨码开关输入CPU的二进制指令,发明C语言的时候,指针是多么有用的工具。。。哦,LINUX是用C编写的,这是非常庞大而强壮的系统,里面指针的应用一点没少。。。而各种语言的编译器,各种词法分析语法分析之类的更不会少用了指针。。。调用的各种库,那里面但凡效率高点的都是C去描述的,指针用的眼花缭乱。。。说现在各种好用的编程语言不用指针了,是因为这些编程语言站在巨人的肩膀上,而这个巨人就是由带指针的C所描述的。。。
因为在别的语言中,指针不叫指针了,比如“引用”等词,或者在一些语言中,由于设计理念的关系,指针特性被封装在语言内部,而对外不可见。指针就是地址,地址就是指针,任何编程都是针对地址的编程,只不过有些事情是编译器,链接器等完成的。
虽然指针给编程语言强大的功能,甚至可以对底层硬件进行操作,到与之对应的是,他也给程序员自己代码带来极大的风险。一但程序猿自己经验不足,可能会带来严重的后果,对于较为健壮的操作系统可能影响比较小,但是对于那些健壮性不是那么好的操作系统,直接就是严重的后果。所以为了规避这种风险,现在很多编程语言都底层封装指针。
J***A中的空指针异常如何处理?
首先明确什么是空指针:从表面上看J***a中如果调用某个没有指向合法引用的对象的某个方法或者引用对象的某个成员变量时就会触发空指针异常,最根本的原因是因为对象为null。
所以解决方案如下:
1:及时初始化对象
2:使用try catch语句块捕捉空指针异常
C语言为什么要引入指针?
几乎所有的编程语言都需要对内存地址进行操作,只不过C语言是显式,其他语言是隐式的。可以从[_a***_]运算的和实际的应用方法两个方面来理解这个问题。
机械运算需要地址操作
打个比方,给你一排计算器。每个计算器上都有一个内存,用M,MR,MC进行内存的读写擦除。在不同的计算器上进行分步计算,利用内存传递中间结果,就可以完成复杂的计算任务。不停地切换计算器的动作就相当于地址操作了。一台计算机相当于由大量的计算器组成的,而程序则规定了在计算器之间切换的步骤。从图灵机到冯氏架构,都可以理解为这样的方式。计算机程序必须得有地址操作,编程语言中出现代表地址的指针也就不足为奇了。但是,地址操作不符合我们的思考习惯,人们还是希望能够隐藏地址操作,赋予地址操作比较接近自然语言的意义。
被隐藏了的指针
在C#中,用ByRef关键字定义指针,而用ByVal关键字定义值。而J***a则刻意隐藏了指针的概念。但下面这个例子中还是漏出了马脚:
String str=“Hello”;
String ptr=new String(“Hello”);
第一行中的变量是值,用它传参相当于复制了自己也就是值传递。而第二行的参数是一个指针,用它传参虽然也会***自己,但是由于它是字符串的首地址,相当于引用传递。如果你留意一下几乎每种语言里都能找到指针的影子。能完全无视指针的语言大概只有SQL吧。这种语言是迄今为止最高级的语言,有人把它称为第五代语言。
C语言是贝尔实验室两位***在研发UNIX的时候顺带研发的副产品,当初发明C语言是为了写操作系统,传统上写操作系统都只能用汇编语言,因为操作系统是直接针对硬件的,高级语言不具备这个功能,汇编语言实在是不好用,编写程序的效率太低而且无法移植,于是两位***就想到了发明一种介于汇编语言和高级语言之间的,可以直接针对硬件的语言,最初第一版叫B语言,然后又进行了改进就叫C语言,其中指针就是一个重要发明,在C语言中指针的意思是指向某个变量的地址,这个变量可以是各种数据类型,显然这是可以直接操作硬件的。最初C语言并没有单独公开发表推广,后来随着UNIX的流行而推广流行开了。
首先,指针就是内存地址。而内存地址计算机中自然存在的东西,所以不存在c语言引进指针这种说法。
那其它语言中没有指针呢?那是因为在这些语言中指针被抽象了、屏蔽了计算机硬件相关的概念,比如J***a、C#。这使得这些语言更安全、更容易使用。但同时也使得这些语言丢失了直接操作硬件的便利。
C语言之所以保留指针,是为了它满足它的设计需求:重写unix操作系统。而操作系统是需要直接操作硬件的,同时也需要程序直接反映内存或寄存器中的数据。这使得c语言直观并且高效,非常适合编写底层的、高效的程序。
C语言本身是为编写操作系统而设计的,对操作系统而言,内存管理、进程管理、设备管理都需要直接对内存按地址读写操作,有了指针,操作系统才能把一个程序调进指定的内存空间中去,才能把硬盘的数据读进指定的内存中去,等等,所以C语言中指针是一个非常重要的工具。
到此,以上就是小编对于J***A语言不允许用指针体现了的问题就介绍到这了,希望介绍关于J***A语言不允许用指针体现了的4点解答对大家有用。