问题一:如何将数字类型的字符串转化为int类型。因为之前对该部分认识不够清晰,特作分析。
1 | String str = "100"; |
对于上面的3种转化方式,
第一种
Integer.parseInt(str);
刚开始想当然的以为其转化为Integer类型的,但是查完API才发现,真实情况为int。
第二种
Integer.valueOf(str);
虽然你在使用的时候可能没有问题,但是不符合其要求。因为要求将String转化为int,而是转化为Integer。当然在jdk1.5之后,已可以自由转换,但不符合题意。
第三种
(int)str;
看着的话,我比对了一下可能性,发现相对来讲这个我曾经用到过其它的强制转化,相必这个也是可以的,但是现实是残酷的。我在验证的时候,发现竟然不能通过编译,整个都是我yy的。其报错的代码是Cannot cast from String to int。我想是不是基本数据类型的问题啊,试着使用Integer,发现还是不行。这个时候才意识到可能是强制类型转换的条件限制。到这个时候,竟然把基础的知识忘掉了,找打啊。赶紧补上,原理如下:
强制类型转换,又叫造型。分为基本数据类型和引用数据类型两种情况。
自动类型转换
在运行程序的时候,经常需要类型转换,Java会在以下情况下,自动做数据类型的转换。
转换前的数据类型与转换后的类型兼容。
转换后的数据类型的表示范围比转换前的类型大。
引用类型的强制类型转换。
对于引用类型来说,什么是强制类型转换呢?简单地说,就是把父类型转换为子类型。因为子类型比父类型的内涵要丰富,无非就是属性更多功能更强,所以要把父类型转换为子类型,需要强制,所以叫强制类型转换。那么,是不是只要是父类型的变量就可以转换为子类型呢?事实上不是,这里是有条件限制的。
首先来看发生在什么情况下。我们用一个类型的构造方法构造出一个对象的时候,对象的类型已经确定了,就是这个类型,但是java允许我们可以不用这个类型的变量引用它,而使用它的父类类型,这时候情况就是我们用一个功能较弱的类型引用了一个功能较强的对象。然而有时候我们又希望这个对象完全发挥它的作用,就需要用一个它本身的类型的变量来引用它,因为原来那个父类的变量是不具备这些功能的,不能使用variablename.function()来使其发挥作用,所以还是用它自己的吧。问题是对象已经在内存中了,已经构造完了,你即使声明一个它本身类型的变量怎么指向它呢?答案是借助原来那个变量,就是它父类型的那个变量,让新的变量和原来的那个指向同一个对象。方式就是两者之间划等号。可是引用类型变量的相等需要两者类型相同,问题是不相同,怎么办?那就是把父类型的变量强制转换成子类型。看到这里有些人可能觉得写的太乱了,其实总结一下,就一句话,只有存在父子关系才可以强制类型转换。
问题二:
对类似String str = “00100”;的字符串,转化为对应的整数?
我的想法,str.subString(str.indexOf(“正则表达式获取第一个非0且非字母的位置”),str.length);但是,后来别人告诉我其实可以直接Integer.parseInt(str);的。
哎,又长知识了。