文档章节

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

王夫子-大猿软件
 王夫子-大猿软件
发布于 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
编程语言漫谈

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

oschina
2016/06/04
4.6K
16
Python 快速入门

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

u011012932
2017/07/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
14
2
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部