张小飞的Java之路——第三章

写在前面:

视频是什么东西,有看文档精彩吗?

视频是什么东西,有看文档速度快吗?

视频是什么东西,有看文档效率高吗?


2. java 程序的5大部分

诸小亮:“师弟,接下来我们就要聊一聊 Java 程序的构成了”

张小飞:“好啊,终于开始正题了”

“一个完整的 Java 程序由很多部分共同组成,比如:关键字、标识符、注释、常量、变量。。。”

“停停停,师兄,您的意思是,之前的程序里有这么多东西?但是看着没你说的这么复杂啊”

“之前的只是入门程序,里面包含的东西并不全,只包含的有关键字、标识符这两项”

“原来是这样”

1. Java内置的——关键字

诸小亮:“咱们首先看——关键字”

关键字:Java 定义的,一些有特殊含义的单词(都是小写)

下图中,高亮的就是关键字

image.png

“师兄,不是用 IDEA 吗,怎么又用上记事本了”

“这可不是记事本,而是 Notepad++,是一个文本编辑器,刚才的 IDEA 只是让你熟悉一下,前期我们以Notepad++ 为主来编写程序,让你练一练手速 ”

“那刚才还安装 idea 干嘛?”张小飞不满的说到

“熟悉一下嘛,idea后面会用的,另外,在命令行中执行程序是非常重要的,会让你有很大的收获,这是每个人都应该体验的一个过程,一定要相信我”诸小亮郑重的说到

“明白” 张小飞看到师兄的表情,也不由的重视起来

“不过,关键字只有上面的 4 个吗?”

“不是的,关键字有很多,不过我们现在不会一个个的介绍,之后写程序的时候遇到一个说一个”

“。。。。,好吧”

2. 自己定义的——标识符

诸小亮:“接下来,我们学习——标识符

标识符:是自己在程序中自定义的名称

下图红框中的都是:

在这里插入图片描述

张小飞:“我总结一下:java定义的叫关键字,我们自己定义的叫标识符,是这个意思吧”

“没错,不过标识符不能随便定义,要遵守一些规则:”

标识符只能由 a-z,0-9, _ 和 $ 组成,还需注意:
    ○ 数字不可以开头
    ○ 不能使用关键字
    ○ 在起名字的时,为了提高阅读性,要尽量有意义

“师兄,能不能列举几个例子”

“当然可以,看看这几个:”

合法标识符: age、name、$address、 _xiaofei
    
非法标识符: 123abc、+salary、 #abc

特别注意:aa、bb、cc 这样的标识符虽然合法,但是阅读性极差,在工作中是禁止使用的

“好的,我大概明白了”

3. 容易理解的——注释

张小飞:“注释是什么意思?”

诸小亮:“Java 是外国人开发的,代码一般都是英文,相对来说不容易理解”

注释:可以让我们用一些文字对程序进行说明,提高代码的阅读性

比如:

在这里插入图片描述

“哦,原来如此,确实容易理解多了,不过,注释都是以 ‘//’ 开头吗?”

“在 Java 中的注释有 3 种:单行注释、多行注释、文档注释”

  • 单行注释:以“//”开头
  • 多行注释:以 “/" 开头 ,"/” 结尾,比如:

在这里插入图片描述

  • 文档注释:"/**“开头,”*/"结尾(一般用不上,了解一下就行)

在这里插入图片描述

张小飞:“那,每句代码都要写注释吗?”

诸小亮:“这倒不用,给你一个建议:写代码前,先写注释,把自己的思路用文字先写下来

“这我明白,就像写作文前,先写大纲一样,对吧”

“是这个道理,你理解的还挺快”诸小亮夸赞道

4. 了解一下的——常量

诸小亮:“来,我们接着聊常量

常量:固定值,不能改变,比如:12345678,这些数字在现实中都是固定的,8就是8,无法改变

张小飞:“怎么就无法改变呢?看我一刀下去,不就成俩 0 了?”
image.png
“那以后就能用这俩 0 来代替 8 这个数字了吗?”诸小亮微笑的问道

“这个,嗯。。。。。”

“你这一刀只是把这张纸分成了两份,但是数字 8 仍然是 8 ,所以说它是常量”诸小亮解释道

“那,按照您在这么说,3.14 也是常量了?”张小飞问道

“是的,Java中的常量分为以下几种:”

整数常量所有整数
小数常量所有小数
布尔(boolean)型常量只有两个数值:true、false,相当于我们中文:对、错
字符常量将一个数字、字母、符号,用单引号(’ ')括起来
比如:‘1’、‘a’、‘冯’、‘$’
字符串常量将一个、多个字符用双引号(“”)括起来
比如:“a”、“冯先生”、“fengxiansheng”、“12345678”
特殊的字符串:“”,表示空字符串
null常量只有一个值 null,表示空,什么都没有的意思

“小飞啊,这些都能看懂吧”

“可以看懂,就是不知道怎么用”

“放心,之后的代码中会经常用到,目前只是了解一下”

5. 非常重要的——变量

1. 总述

诸小亮:“师弟,下面要介绍变量了,这是非常重要的,一定要仔细听”

张小飞:“师兄放心”

“变量:顾名思义,就是可以改变的值,比如:在数学中定义 x=3,y=4,z=x+y (xyz都是变量)”

在 Java 中定义变量,格式:数据类型 变量名 = 变量值;(注意:末尾有分号)

“师兄,这个数据类型是???”

“就是字面上的意思,比如:3是整数类型,3.14是小数类型(也叫浮点数类型)”

“原来如此,明白”

“Java中定义了 8 种基本数据类型,比如:”

在这里插入图片描述

良久,“师兄,我有 3 个问题,第一:byte、short、int、long都是整数类型,为什么有4种?”

诸小亮:“之所以分成4个类型,是因为每个类型占用的内存空间不同,来先给你普及一下基础知识:”

计算机中的单位换算:
    1 B/byte(字节) = 8 bit(比特)(位) 
    1 KB(千字节) = 1024 B/byte(字节) 
    1 MB = 1024 KB 
    1 GB = 1024 MB 
    1 TB = 1024 GB 
    1 PB = 1024 TB 
    1 EB = 1024 PB
    

编写代码时会设置大量的变量,在程序运行时每个变量都会占用一定的内存
但内存是比较珍贵的资源,如果用较小的空间就能够达到目的最好
比如:如果只做 100 以内的计算,那么使用 byte 类型就好

“原来如此,第二个问题:浮点数 和 布尔类型我能理解,不过这个字符,为什么取值也是数字呢”

“这个,之后的写代码时会给你详细解释的”

“好吧,那么第三:这些类型该如何使用呢?”

“这就是我们接下来要做的事情了”

2. 整数类型

“小飞啊,整数是我们工作中做常用的,所以一定要好好听,来,我们修改这个 Demo.java 文件”


注意:我们定义 byte b = 3; 这个 b 就是标识符

“师兄,您刚才还不是说不能用 aa、bb这样的标识符吗?现在。。。。。”张小飞无语到

“这个…嗯…,其实这个 b 是 byte 的意思,师弟,这不是工作,不用这么严格”

“好吧。。。。。”

“接着,我们在命令行对它进行编译:”

image.png
“师兄,您这样做的目的是???”

“马上你就知道了,我们继续修改:“

在这里插入图片描述

“你再次编译看看”

“师兄,这是不是编译失败了?”张小飞说到

在这里插入图片描述

诸小亮:“是的,我给你解释一下”

  • 在 Java 中,默认所有整数都是 int 类型,所以 300 被当成 int 类型
  • 代码中,要把 300 赋值给一个 byte 类型的变量,而 byte 的取值范围是 -128~127 ,容不下300,所以提示:“从 int 转换到 byte 可能会有损失
  • 而 byte b = 3; 虽然 3 也被当作 int,但 3 在 byte 的范围内,编译时会自动转为 byte 类型

张小飞:“原来是这样,我明白了,这表示之后使用整数时要先确定它具体是哪个类型

“没错,我们继续定义其他整数类型”诸小亮说到

在这里插入图片描述

“师弟,注意,上图的代码编译,还会报错:”

在这里插入图片描述

张小飞疑惑的问道:“这不对吧, 之前说过 long 类型的最大值是 2 的63次方 - 1,而 12345678900 远远小于这个值,为什么还报错呢?”

诸小亮:“原因:在 Java 中默认认为所有整数都是 int 类型,报错是因为 12345678900 超过了 int 的最大值”

“原来是这样,那该怎么办呢?”

“很简单,只需要在12345678900后面加上一个 L 就行了,表示这个数字是 long 类型,比如:”

在这里插入图片描述

“你再次编译试试看”

张小飞:“确实,修改后再次编译,不报错了:“

在这里插入图片描述

3. 自动类型提升

“师兄,自动类型提示是什么意思?”

“用代码演示一下你就明白啦,还是修改之前的代码:”

在这里插入图片描述

结果:

在这里插入图片描述

张小飞:“3+4=7,这不是很正常嘛”

诸小亮:“你仔细看,代码中,x是 byte 类型,y是 int 类型,为什么 x+y 的值 可以赋给 z 呢?

“是啊,为什么?”张小飞恍然大悟道

“这就是自动类型提升

不同类型数据计算时,小类型会自动转换为大类型

“你的意思是,x +y 时自动把 x 从 byte 升级到了 int 类型?”

“是的,你理解的完全正确,不过要注意一点:同类型计算也可能出问题,比如:”

public  static void main (String  []  args)  {
    short a=1;
    short b=2;
    short c= a + b;
}

结果:

image.png
张小飞:“这是为什么呢?a 、b 、c 都是 short 类型啊”

诸小亮:“因为:int 是 java 中整数的默认类型,小类型(byte、short)的计算同样会自动类型提升

“那,两个 int 类型做计算时,会自动提升为 long 类型?”

“这个倒是不会,记住:int 是 java 中整数的默认类型

“好吧,**int 是 java 中整数的默认类型,**这个你说了很多遍了,我记住了”

“很好,孺子可教也”

4. 强制类型转换

1. 演示

诸小亮:“师弟,你能参考自动类型提升,来解释一下什么是 强制类型转换 吗?”

张小飞思索了一下:“自动类型提升是小类型升级为大类型,强制类型转换是大类型转为小类型?”

“没错,是这个意思,我们先看一段代码:”

public static void main(String[] args){
    //计算 x + y,并输出结果
    byte x = 3;
    int y = 4;
    byte z = x + y;
    System.out.println(z);
}

“师兄,这段代码有问题吧”

“哦?你来说说看是什么问题”诸小亮好奇的问道

“x 是 byte 类型,y 是 int 类型,按照刚才的说法: x+y 时 x 会自动提升为 int 类型,所以 x+y 的结果是
int 类型 ,把一个 int 类型的值赋给 byte 类型的 z 不是有问题吗?如果我记得没错的话,编译的时候应该会提示:从 int 转换到 byte 可能会有损失”张小飞回答到

“厉害,你说的一点儿都不错,这是编译的结果:”

image.png
“但是,如果告诉你有一种方法可以让上面的代码赋值成功呢?你想不想知道?”

“师兄,你就别卖关子了,直接说吧”

“我们继续修改代码:”

在这里插入图片描述

“这样编译就不会报错,程序也正常运行:”

在这里插入图片描述

张小飞:“原来这就是强制类型转换啊,很简单嘛”

诸小亮:“是的,确实很简单,但是如果使用不当,也会造成一些问题的”

“什么问题?”

“来,我们再次修改代码,这次修改 y = 400”

在这里插入图片描述

“你看看最终输出的结果是多少”

“这个。。。,怎么会是一个负数?”

在这里插入图片描述

“因为:x + y =403,这是一个 int 类型的数值,强制转换为 byte 后,精度缺失造成的”

“精度缺失???”张小飞疑惑的问道

“是的,想要彻底明白这个问题,我们需要先聊一聊二进制

“。。。。。。二进制又是什么鬼”

2. 神奇的—二进制

诸小亮:“二进制:本质是一种计数方式,也是计算机语言

计数方式:十进制(满10进1),60进制(60s=1m),7进制(7天=1周),这些都是计数方式

二进制比较特殊,是满 2 进 1,比如:1+1=10,10+1=11,11+1=100
	注意:二进制都由 0 和 1 组成

张小飞:“这个计数方式我能理解,不过它也是计算机语言?”

“是的,在计算机中,一切都是以二进制形式存在的,不同的 01 组合代表不同的含义使用不同的 01 组合代表世间万物,所以就有虚拟世界这一说法”

比如:01010代表:我,01011代表:你,0000000111111代表:他
注意:这里只是举个例子,并不是说 ‘我’ 在计算机中对应的就是:'01010'

张小飞:“有点儿意思,按照您的说法,数字在计算机中也是用二进制表示

诸小亮:“没错”

“师兄,可否让我见识一下,一个十进制数字用二进制怎么表示?”

“当然可以,网上有很多进制转换的工具,比如:https://tool.oschina.net/hexconvert/
image.png
“这个,10 具体是怎么变为 1010 的呢?”张小飞问道

“转换的方法不是重点,重点是:int a = 10;,那它的二进制实际是:00000000 00000000 00000000 00001010”

良久,张小飞:“我明白了,因为 a 是 int 类型,占 4 字节 ,也就是占 32 个位对吧”

“是的,其实把一个数字换位二进制分两步:”

1. 利用上面的网址转换为二进制
2. 在左侧补0,具体补多少个0,就看它是那种类型的

张小飞:“我来试一下,如果 byte b = 3 ,那么它的二进制是:00000011”

“完全正确”

“师兄,如果是一个负数呢?您提供的网站工具是这样显示的:”
image.png
“上面给的不对,负数的二进制稍微麻烦一些,以 byte b = -10 为例,分为 3 步:”

1. 先获取它的正数的二进制,是:00001010,这称之为:-10 的原码
2. 将原码的每一位做取反,得到反码:11110101
3. 将反码+1:11110110,这就是 -10 的二进制

“师弟,其实这个负数的转换,了解一下就行了,实际时候用的并不是很多”

“好的,不过到现在我也不明白,这个跟 **精度缺失 **有什么关系呢?”

3. 最终解惑

诸小亮:“我们回忆一下:x + y = 403,是 int 类型,占 4 字节(32位),那么它的二进制。。。”

“403 的二进制是:00000000 00000000 00000001 10010011”张小飞抢着说到

“没错,而我们的代码是把 int 类型转为 byte 类型”

byte 类型,占 1 个字节,int 类型 转换为 byte,就是要丢掉3个字节,这就是精度缺失

“丢掉 3 个字节,那不是变成 00000000 了吗?这应该是 10 进制中的 0 啊”张小飞说到

“错了,应该是丢掉左侧的3个字节,那么剩下:10010011,而它的十进制就是 -109 ”诸小亮回复道

“原来如此”

“师弟,在告诉你一个结论:计算机中,二进制最左侧以 1 开头的都是负数

“明白!!!”

5. 小数类型

诸小亮:“我们接着看小数类型,也就是浮点数类型,这个就比较简单了”

float 和 double,double的精度更高一些
	精度:精确程度,小数越多,精确成度就越高

“但是,实际开发中一般不用 float ,为了数据的准确性,都使用double,比如:”
image.png
编译会报错:

在这里插入图片描述

张小飞:“让我猜一猜,报错的原因是:** Java 中默认认为所有小数都是 double 类型**”

“是的,如果要用 float 类型,需要在末尾加上一个 f,比如:”

在这里插入图片描述

6. 布尔和字符类型

诸小亮:“布尔类型很简单,定义一个boolean类型的变量如下:”

在这里插入图片描述

张小飞:“这个很容易理解,我疑惑的是 char 类型为什么是数字?”

“先看一段代码,然后再给你解释”

在这里插入图片描述

结果:

在这里插入图片描述

“师兄,说实话,这个代码和输出结果,让我更加的迷糊了”

“来,我给你解释一下:”

  • 计算机能理解的语言是:二进制,而人类的语言是:abc、你我他、0-9、!@#$%等,
  • 为了方便的跟计算机沟通,先辈们使用二进制跟人类语言做了个映射
    • 比如:01100001---->a,01100010---->b
    • 这种映射关系称为:ASCII编码表

“就是用二进制来表示世间万物嘛,这个我懂,但是没想到前辈们竟让做了一张表出来,这个表是什么样子的?”

“来看下面的这张图:”

在这里插入图片描述

“从图中可以看出,01100001转换为 10 进制就是 97,也就是字母 a,正因为这样,所以 char 类型的值可以是数字也可以是字符

“那为什么代码中两个输出,一个是数字,一个是字符呢?”张小飞接着问

“上面代码的执行过程是这样的:”

  • 计算机先把 97 转换为二进制:01100001
  • 执行 println 时,因为 c 是 char 类型,所以就通过ASCII编码表找到了a,并输出
  • 执行:c2 + 2 时,因为类型不同,c2先做类型提升(转换成97),所以最终结果是 int 类型的 99

张小飞:“原来如此,这下我就明白了”

诸小亮:“那么我们接着说,接下来是。。。。”

“停停停,师兄,这都中午了,该歇一歇了吧,肚子都饿扁了”

“哦?没想到时间过的这么快,那好吧,走吃饭去,回来后你好好练一练”

“啊?不会吧,正所‘食饱思眠欲’,吃过饭后不应该睡一觉吗?”

“大白天睡什么觉,浪费生命”

“这你就不懂了,睡觉是一种艺术,睡不好是你糟塌了,没听过吗?‘少睡一分钟,就缺少60秒的幸福’”

“行行行,我说不过你,不过下午可不会再给你时间练习的”

“放心吧,这也没多少东西,早就记牢了”

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值