java基础_String类型和char类型、自动类型提升和强制类型转换

String:字符串类型,用 ”” 『双引号表示』

 

Char:字符类型,用’’『单引号表示』,里面只能有一个字符或者没有,表示空字符。在内存中占据两个字节,也就是2Byte,也就是16位(16bit

一、常见的字符类型数据:

a) 1,2,3,9,0int类型的 12,3,,,0有什么区别?-用单引号包围的就是字符类型,没有单引号的就是int类型』

b) a,b,ca,b,c有什么区别?-双引号包围是字符串,只要是被字符串包围的无论里面是空、1个、多个数据,都是String类型,都是字符串。就像是你吃羊肉串一样,买的时候上面有很多羊肉串起来,别人问你”你手里拿的是什么?“当然说”羊肉串“。当你吃得还剩一片羊肉的时候,别人问你”你手里拿的是什么?“当然还是说”羊肉串啊“。当上面的羊肉被你吃完的时候,别人问你”你手里拿的是什么?“当然说”羊肉串啊,不过刚刚吃完。。。“』,所以双引号包围的无论多少个,这个都叫做字符串

c) ',,\,,+-’’*/等等,就是常见的英文标点符号

d) 常见错误:ab-----这是既不是字符串,也不是字符,没有这种表示形式

e) 键盘的诞生:

a) 计算机并不认识这些字符,但是不能向上世纪60年代那样,每次让计算机执行一些东西还要苦逼通过纸条向计算机输入一些二进制代码段来让计算机执行吧,这个不是人干的活还是交给计算机吧。那我们想向计算机输入什么呢?当然是我们能看懂的了,当然计算机刚开始美国人发明的,没办法,于是他们在想:要是可以向计算机输入我们日常生活中的符号让计算机认识就好了(美国人生活中的符号:abcdef.....ABCD.....+-*/........,;等等了);不要说为甚不输入字符串,字符串可以由字符拼接成好吧,就像文章都是由一个个文字拼成的。。。),但是之前通过纸条输入的二进制代码段计算机认识,现在直接输入abc。。。怎么能让计算机认识呢?--当然是要在计算机和人之间有一个翻译者了,我输入a,翻译者给我翻译成计算机是识别的二进制,然后让计算机来执行(这个翻译者是人呢还是机器呢?当然是机器了,要是人的话估计会死人的,谁这么顺畅能把字符给你翻译成二进制啊。。。。。)。那么这个翻译者做的事就是参照一个东西,把a对应成一串二进制代码。(b说话了:哎,a有对应,我也要有对应。。。Cdef   .,;  +*/  发出了同样的心声。既然是心声,当然要满足了),于是abcdef+*/;’。,都在计算机中都有了一一对应的二进制代码段

b) 可是呢谁来充当这个翻译,来主动去查表呢?就像你输入了一个a,谁来自动转换成一串二进制代码段呢?

c) 这里我们忽略了一个重大的问题:你是怎么输入a的啊???之前是用纸条向计算机里面输入一长段二进制的。现在你仔细想想,当然你会回答键盘啊。啊哈,那我们为甚不让键盘来做这个翻译者呢!这不就变成了,当我们在键盘上面按下a的时候,a的下面是一连串的电路板,它就送进去一连串和a对应的的数字脉冲,送达计算机,计算机吧这些数字脉冲转换成二进制,去查那个二进制——字符表,返现这一连串的二进制表示的是a,就在屏幕上面显示a了。当然b按键的下面也是一对电路板,一按下去就会向计算机发送一连串和b对应的数字脉冲,也到计算机中转换成二进制了,查表,返现是二进制对应b显示之

d) 

e) 其中参考的表就是传说的ASCII

f) 

g) 当然这种表通用叫做 :编码表。老美的就叫做ASCII表,ASCIIAmerican Standard Code for Information Interchange美国标准信息交换代码)

h) 当然,你说中国人用的表是什么?GB2312-国标表(存储6000多个汉字)。这够吗不够啊,因为我们还有少数民族等等,,,,

i) 于是就出现了GBK编码表,貌似这个可以存储两万多个

j) 前面说了char类型可以存储两个字节吗?那它可以存储一个汉字吗?可以,因为一个汉字在计算机中占据了两个字节,所以一个char类型正好可以存一个汉字

 

 

 

二、下面说的是java中的类型转换了

a) 

b) Char 两个字节

c) Int 4个字节

 

三、自动类型提升:

i. 

这段说的是char类型的chint类型的1做加运算,看了一下内存图,发现一个占了两个字节 ,一个占了四个字节,怎么相加,是把int类型的转换成两个字节?还是char类型的转换为四个字节呢?

ii. 【现实举例:A住惯了三星级的宾馆,A的老板住惯五星级的酒店,有一天老板叫A和他一起去出差,你说两个人晚上会住在哪一种,公司的行政人员绝对不会委屈老板的,也不会让A感觉尴尬的,会自动的定两张五星级酒店的票的】

iii. 所以在这里我按照现实来类推,方便理解,char类型会自动转换为四个字节,然后再进行加运算。

iv. 

之前会有疑问:为什么输出的不是a1或者不是01010101001呢?

v. 首先是将ch转换为四个字节的int类型的,是系统自动支持的向上转型的
(行政人员自动提升A的住宿的等级),然后查找aASCII表中对应的二进制转换为十进制的整数是多少——a对应的十进制的是97,再+1,当然是98了(为甚是十进制不是二进制?因为默认输出显示是十进制的,人类好看啊,你要是执行二进制也行哎)。

vi. 会有另外一个疑问:为甚不输出b呢。因为98对应的也是ASCII表中的b

1. char类型的'a———ASCII码表———>十进制的97

2. int类型的97  + 1————————>int 类型的98 

3. 我把结果int 类型的 98赋值给的是int类型的 x

4. 你又没叫我赋值给 char类型,我凭什么给你显示b

5. 『就像,老板没有说定两张三星级的宾馆,我当然给你五星级的了,要是老板说了那就是强制转换为三星级的,,,,,,』   

四、下面就说说强制类型转换

a) 说的不好听的就是降级了:由占4个字节的int——————>向占据两个字节的char转换

b) 要是改成这样来写

c) 

编译下就会出现错误:无法解析的编译问题,就是编译阶段通不过:

d) 下面解释一下编译阶段和运行阶段:编译检查语法是否出错,不进行变量的运算,要是你编译的时候就进行变量的运算的话,那还要运行阶段干嘛!

e) 【这里就像是老板没有说变成三星级宾馆,行政人员打电话去订三星级的宾馆,检查的说老板没说三星级的啊,之前不是都五星级的吗,不行不通过,除非拿老板的指示才给订,这就是犯了编译错误】

f) 要是我就是想转换成char类型的呢?就是想输出b?程序给的提示是

g) 

也就是老板就是说要住三星级的宾馆呢?那就是行政人员得到了老板的命令指示了,这样定票的时候给检查的说:喏,这是老板的批示,他自己要住三星级宾馆的。这时候检查的就会想,老板你这要做好吃苦的准备啊,估计住几天会减几斤肉 【在编译器{检查人员看来},这是int型数据要降低自己精度的节奏啊,也就是可能出现数据损失】

h) 所谓的int的数据损失就是四个字节的int类型的数据——————>两个字节的char类型数据

i) 

举例:65536int型中经过转换之后,前面的就没有了,因此说损失了精度

j) 

那么老板的批示在程序中是什么?点击了上面第一个提示后如下:

k) 

l) 输出结果:

m) 

n) 现在解释一下为什么程序不能自动向下转换类型,也就是编译器为什么不能通过检查。可以看到

i. 

ii. 

iii. 为什么???

iv. 我们知道char类型占据两个字节,能表示的范围是0~65535((216次方)-1)。按照我们的理解:h1相加的结果是是在98是在char的范围里面的,是对应b的,为甚检查不通过呢?为什么下面的char x1=a+1;也是表示的char x1=98;为什么这个就是可以呢??

v. 问题就出现在所谓的 【编译器编译阶段不运算】,那你肯定会说了:不运算,他怎么知道98时在char范围内的?

1. 下面解释一下:所谓的编译阶段是不执行   包含变量的运算,因为常量的值是确定的了,可是你又会说:我的char  x=h+1;里面的h不是赋值了a了吗??可是在第一个代码段之间我是可以加句子的:比如如下效果:

2. 

3. h赋值了一个char类型的最大值,可以想象下面要是再加1的话,就超出范围了,下面输出结果就表示超出char类型的范围了

4. 

5. 下面的char x1=a+1 不执行运算吗?这是执行运算的,因为a是一个常量,在编译阶段是不会再改变的了。你说要是

6. 因此要是表达式中涉及到变量或者是其他全部是比char类型高的常量出现在表达式的右边的时候,都要加上强制类型转换

7. 编译器『订票的检查人员』做的事情就是在没有 明确的强制转换指令『老板的批示』情况下,杜绝出现可能出现错误『订三星级宾馆的票』

 





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值