文档章节

漫谈之基本类型和流程控制

王夫子-大猿软件
 王夫子-大猿软件
发布于 2017/08/27 10:42
字数 1983
阅读 2
收藏 0

天我们聊一下Java里面的基本类型和控制流程语句。如果说现实世界中的物质是由原子分子构成的,那么在Java里面就是由基本类型来构成的,当然还有引用类型。既然叫做基本类型,那必然是Java里面最常用的类型,基本类型可分为整型、字符型、浮点型和布尔型。这四种基本类型分别由byte、short、int、long、char、float、double和boolean组成的。这八种类型表示了整数、负数、小数、字符和真假。

 

我们知道Java是一种强类型语言,在编译阶段就要确定变量的类型,所以在我们声明类型的时候,要么使用基本类型来表示,要么使用引用类型来表示。另外,这几种类型中,除了布尔类型不可以相互转换外,其他的类型之间都是可以互相转换的,比如,short和int、int和char、char和int等,在转换的过程中,一定要注意范围,因为,基本类型都是有范围的,比如byte它所表示的范围就是[-128, 127]之间,如果要把333数值赋给byte变量,那么在编译的时候就会出错,编译器会告诉我们这样转换会有精度损失,除非我们使用强制转换才能正常编译通过,代码如下:

 

byte a = (byte)300;

 

虽然,这样可以正常编译了,但是得到的结果确变了,不再是333,而是77,这是因为byte只能表示[-128, 127]之间的数字,333超出了表示范围,我们知道int是32位的,byte是8位的,所以,只能将码值截取后8位,然后进行取补码获得转换之后的值就是77。这是我们需要注意的地方,向下转型是危险的,有精度损失的。如果是向上转型,比如,int转换成long,就没有任何的问题,也不存在精度问题,因为long表示的范围远大于int所表示的范围。

 

我们再谈一下浮点型,浮点型有float和double两种,其中float是单精度的,double是双精度的,所以double的精确度更高,Java里面默认的小数就是double类型的。其中我们要注意的是,虽然float只有32位,long类型有64位,但是float表示的范围要比long的范围要大,这是什么情况?要回答这个问题,我们需要看一下浮点型在Java内部是如何表示的,浮点型的表示方法分为三部分,第一位是符号位,后面8位是指数域,最后23位是小数部分,它和整型表示的方式不同,所以范围也就有了差别,小数是一个无穷的,比如[5, 6]之间的小数就是无数个,所以这也是为什么浮点型的表示方法和整型不同的原因。

 

字符型char,它的内部就是Unicode编码,表示的范围是[0, 65535],字符型我们主要关心的是乱码问题,经常在开发中,会有乱码的出现,往往我们就只能乱改,蒙对了就完事了,下次开发还会有同样的问题。所以,我们要了解乱码的本质,其实在Java里所有的编码都是Unicode的方式,我们要编译一个Java源文件,就要先根据本地操作系统的编码方式将其转成Unicode的编码,比如操作系统是GBK的编码,那么Java就会根据GBK编码读取Java源文件,然后将其转换成Unicode编码,所以,如果你的源文件是UTF-8的编码,这个时候,就会出现乱码,用GBK读取UTF-8的文件,肯定会有乱码,这也是导致乱码的根本原因,所以,我们要准守一个规则,读写文件时一定要按照统一的编码进行,否则就极有可能出现乱码的情况。

 

布尔型最简单,就是true和false两个值,要说布尔型,必须要和我们的控制流程语句结合着说,控制流程语句分为分支和循环,它们两个可以混合着使用。分支语句有if、if...else...、switch...case...,循环有for、while、do...while...三种。

 

先看下if分支语句,它的条件就是Boolean型的,如果是true则执行if里面的代码块,反之,则跳过if语句,执行下面的代码。还有switch语句,它接收的不是Boolean型,switch可以接收很多种类型,除了基本类型外,String和枚举也都可以作为判断依据,另外,在使用switch语句的时候,我们要注意穿透问题,如果在case里没有写return或者break语句,程序会一直执行下去,这就会造成不必要的bug,所以在写switch语句的时候要当心,另外,不要忘记写上default,如果都没有匹配上,就会执行default的语句。

 

我们再看看循环语句for,for循环是经常使用的循环语句,可以使用:

for(表达式一;表达式二;表达式三)

 

其中,表达式一可以写上任意的语句,而且只会执行一次;表达式二主要是用作退出表达式的条件语句,它是作为每次循环最先开始执行的语句;表达式三每次循环结束后,都会执行。当然,我们也可以什么都不写,比如for(;;),这样写就会无限循环执行下去,除非遇到return语句或者程序抛出异常了。

至于嵌套循环,实际开发当中很少碰到,顶多有两层嵌套循环,比如打印输出9*9乘法表,就能使用两层嵌套循环来完成,如果嵌套多了就会影响程序的性能,比建议使用多层嵌套循环,想办法避免这样的代码。

 

循环里面比较重要的是如何跳出循环,尽量避免死循环,这样会浪费CPU的效率,很容易使CPU达到100%的状态,严重影响机器的性能,所以,合理使用break、continue和return是很重要的,另外,在嵌套循环的过程中,break和continue只能在当前循环体里起到作用,对外层是不起作用的,我们可以使用标示作用在外层循环体,我们在内部循环体里可以使用break 标示或者continue标示都可以作用到外层循环里,这个知识点是我们需要注意的,当然在开发中很少使用了。不管有基层嵌套循环,是要使用了return,都会结束循环,并且逃出方法体。

 

最后我们再看一下运算符,说到运算符,我想很多人都会想到运算的优先级问题,其实,这个根本不是事儿,解决优先级最好方式就是使用"()",当你拿不准哪个优先级的时候,就使用括号吧,当然,在开发中不可能写很变态的运算表达式,很容易出问题的。运算符除了加减乘除外,还有逻辑运算与或非等,还有三目运算,例如:

 

表达式一 ? 表达式二 : 表达式三

 

其中表达式一的结果是布尔型的,如果是真,则执行表达式二,反之,执行表达式三,就是这么简单。

 

以上,就是今天跟大家聊的话题,内容都是很基础的,没事的时候多看看,夫子教导我们温故可以知新,这就是进步。

© 著作权归作者所有

共有 人打赏支持
王夫子-大猿软件
粉丝 1
博文 17
码字总数 8668
作品 0
南京
程序员
编程思想 之「对象漫谈」

在「语言导论」中,我们曾提到过「万物皆对象」,事实上,也确实如此。在面向对象编程的世界中,我们创建对象、操作对象、销毁对象,我们所做的一切动作都离不开对象。在本章中,就让我们一起...

qq_35246620
2017/12/04
0
0
Linux IO模型漫谈(3) -- 阻塞式IO实现

在理解代码前有几个函数先说一下: 1 sockaddr_in 套接字地址结构 struct sockaddr_in { } POSIX规范只需要指定其中的sinfamily, sinport, sin_addr三个字段 这个结构非常重要!! 2 socket...

晨曦之光
2012/06/07
76
0
分布式版本控制系统 Git 的分支漫谈

Git是Linux之父 Linus Torvalds 编写的分布式版本控制系统。它最初是用来取代商业软件 BitKeeper 管理 Linux 内核开发的。与其他版本控制系统相比,Git 有很多优势,具体内容可以参照不久前我...

红薯
2010/07/18
745
0
Python 快速入门

学习 Python 的由来 第一次接触 Python 时,是在刚毕业不久,那时公司在做一个网盘客户端,需要调研一些 GUI 框架。由于当时 Python 很火(当然,现在也一样),便尝试了一下 PyQt(Python ...

u011012932
2017/07/07
0
0
编程语言漫谈

写在前边:我们知道现有语言的编程范式有:过程式,面向对象,函数式,逻辑式。随着软件工业化程度的普及,以及软件的复杂度越来越高,编程语言的发展历程也是从最初的过程式(命令式)语言c...

oschina
2016/06/04
4.6K
16

没有更多内容

加载失败,请刷新页面

加载更多

下一页

深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
5分钟前
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
39分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
2
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部