张小飞的Java之路——第三章
写在前面:
视频是什么东西,有看文档精彩吗?
视频是什么东西,有看文档速度快吗?
视频是什么东西,有看文档效率高吗?
2. java 程序的5大部分
诸小亮:“师弟,接下来我们就要聊一聊 Java 程序的构成了”
张小飞:“好啊,终于开始正题了”
“一个完整的 Java 程序由很多部分共同组成,比如:关键字、标识符、注释、常量、变量。。。”
“停停停,师兄,您的意思是,之前的程序里有这么多东西?但是看着没你说的这么复杂啊”
“之前的只是入门程序,里面包含的东西并不全,只包含的有关键字、标识符这两项”
“原来是这样”
1. Java内置的——关键字
诸小亮:“咱们首先看——关键字”
关键字:Java 定义的,一些有特殊含义的单词(都是小写)
下图中,高亮的就是关键字
“师兄,不是用 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 了?”
“那以后就能用这俩 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 的意思,师弟,这不是工作,不用这么严格”
“好吧。。。。。”
“接着,我们在命令行对它进行编译:”
“师兄,您这样做的目的是???”
“马上你就知道了,我们继续修改:“
“你再次编译看看”
“师兄,这是不是编译失败了?”张小飞说到
诸小亮:“是的,我给你解释一下”
- 在 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;
}
结果:
张小飞:“这是为什么呢?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 可能会有损失”张小飞回答到
“厉害,你说的一点儿都不错,这是编译的结果:”
“但是,如果告诉你有一种方法可以让上面的代码赋值成功呢?你想不想知道?”
“师兄,你就别卖关子了,直接说吧”
“我们继续修改代码:”
“这样编译就不会报错,程序也正常运行:”
张小飞:“原来这就是强制类型转换啊,很简单嘛”
诸小亮:“是的,确实很简单,但是如果使用不当,也会造成一些问题的”
“什么问题?”
“来,我们再次修改代码,这次修改 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/”
“这个,10 具体是怎么变为 1010 的呢?”张小飞问道
“转换的方法不是重点,重点是:int a = 10;,那它的二进制实际是:00000000 00000000 00000000 00001010”
良久,张小飞:“我明白了,因为 a 是 int 类型,占 4 字节 ,也就是占 32 个位对吧”
“是的,其实把一个数字换位二进制分两步:”
1. 利用上面的网址转换为二进制
2. 在左侧补0,具体补多少个0,就看它是那种类型的
张小飞:“我来试一下,如果 byte b = 3 ,那么它的二进制是:00000011”
“完全正确”
“师兄,如果是一个负数呢?您提供的网站工具是这样显示的:”
“上面给的不对,负数的二进制稍微麻烦一些,以 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,比如:”
编译会报错:
张小飞:“让我猜一猜,报错的原因是:** 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秒的幸福’”
“行行行,我说不过你,不过下午可不会再给你时间练习的”
“放心吧,这也没多少东西,早就记牢了”
张小飞的Java之路——第三章相关推荐
- 张小飞的Java之路——第九章
写在前面: 视频是什么东西,有看文档精彩吗? 视频是什么东西,有看文档速度快吗? 视频是什么东西,有看文档效率高吗? 诸小亮:"封装说完后,我们接着看面向对象的第二大特征--继承" ...
- 20145302张薇《Java程序设计》实验三报告
20145302张薇<Java程序设计>实验三:敏捷开发与XP实践 实验内容 使用git上传代码 使用git实现代码开发实践 实现代码的重载 使用git上传代码 git init git ...
- 尚硅谷Java入门视频教程第三章——数组
尚硅谷Java入门视频教程第三章 第二章复习 课后习题 复习 嵌套循环典型例题 Ecplise的安装使用 第3章:数组 3.1 数组的概述 3.2 一维数组的使用 3.3 多维数组的使用 3.4 数组 ...
- Java学习之路 第三章 流程控制
第三章 流程控制 1.if条件语句 (1)简单的if条件语句语法: if(条件){语句: } 注意:a.条件必须最后返回一个布尔值. (2)嵌套if语句语法: if(条件1){if(条件2){...} ...
- Effective Java 读书笔记----第三章
第三章 对于所有通用的方法 主要讲的是对Object类的非final方法(equals,hashCode,toString,clone和finalize)覆盖的一些规则 1.覆盖equals时请遵守通 ...
- 【JAVA SE】第三章 运算符、条件语句、switch结构、while循环、do…while循环、for循环、break关键字以及break和continue关键字
第三章 运算符.条件语句.switch结构.for循环.break关键字以及break和continue关键字 文章目录 第三章 运算符.条件语句.switch结构.for循环.break关键字以及b ...
- Java并发编程 - 第三章 Java内存模型
前言: Java 线程之间的通信对程序员完全透明,内存可见性问题很容易困扰 Java 程序员,本章将揭开 Java 内存模型神秘的面纱. 一.Java 内存模型的基础 1.1 并发编程模型的两个关键问 ...
- 移动通信学习之路----第三章
移动通信第三章 知识点总结 第三章 组网技术基础 1.移动通信网的基本概念 2.无线电干扰 3.区域覆盖 4.信道(频率)的分配方法 5.提高蜂窝系统容量的方法 6.移动性管理 7.越区切换准则 8. ...
- 【流放之路-第三章】
来到萨恩城废墟 来到平民窟 来到火葬场 发个传送门打完回城交所有任务再到贫民窟 来到下水道口 来到黑石陵墓 跑完试炼回城 退出重进 第三章买:漩涡.第二章:精准破坏.第一章:效能.第二章:元素集中 一 ...
最新文章
- MySQL Cluster(MySQL 集群) 初试
- SQL Server 表分区注意事项(转载)
- A Windows Mobile GPS Application Sample – Using Fake GPS
- BTrace实现浅析
- 《Java和Android开发学习指南(第2版)》——第2章,第2.10节本章小结
- Kali Linux 网络扫描秘籍 第四章 指纹识别(二)
- Python 之详解深拷贝和浅拷贝
- 深入浅出通信原理连载145-389(Python代码版)
- kubernetes(4)Pod的核心概念、Pod的调度
- 进程间通讯SendMessage
- 还在为 520 发愁吗?教你用 Python 写个表白神器
- 用CHATGPT做微信视频号和抖音大神,就这几步!
- IOS开发插件和工具总结
- 仿淘宝 打开app时识别淘口令和解析保存到本地的带二维码图片的网址
- 怎样学好英语?(多年英语学习经验总结)
- QGIS制图中面积小的区域不显示注记
- canvas 贝萨尔曲线
- 【编程语言】计算机编程语言
- 【Pygame实战】飞机射击大作:宇宙激战一触即发...这款超经典的射击游戏也该拿出来重启了~
- POJ 1753 翻棋子 (dfs+递归)。
热门文章
- 学习爬虫之Scrapy框架学习(3)---豆瓣top250电影完整版信息获取及如何存储到mysql数据库;Scrapy shell和Scrapy选择器;使用到日志的学习!
- python求语音信号短时能量、短时过零率、语谱图
- java的rest教程,REST接口
- linux内核的原子操作简述
- part1:推荐一些适合练手、课程设计、毕业设计的python小项目源码,无任何下载门槛
- sql server出生年月减去退休年月 计算年龄
- foxmail邮箱怎么导入邮件_Foxmail怎样导入和导出邮箱账户和邮件
- 最简单的单层神经网络实现鸢尾花分类
- Zookeeper 原理与优化
- git切换master项目,新建分支new branch