(一)数据类型初阶
1.概述
Java定义了基本数据类型、引用数据类型和自定义类型。
本主题将介绍Java的八种基本数据类型和引用数据类型中的String类型。
计算机存储数据分为以下三个空间:寄存器、栈空间、堆空间,其中寄存器Java语言不能直接控制和处理。Java虚拟机为每一个运行在内存中的Java程序分配相应的
栈空间和堆空间。
2.栈空间
特点:1)栈空间存取数据的效率高;2)栈中的数据按“先进后出”的方式管理;3)栈空间存储空间较小,不能存放大量的数据。4.JVM将基本类型的数据存放在栈空间。
3.堆空间
特点:1)堆空间存取数据的效率最低;2)数据存放的位置随机分配;3)堆空间存储数据的空间大,能存放大容量的数据,包括数组、字符串、对象、集合。
(二)变量的定义和变量使用的原因
1.什么是变量
变量就是可变的量;常量就是不可变的量;字面量:Java的变量和常量中存放的具体的数据。
2.为什么使用变量
计算机的高级语言普遍使用变量来管理内存中存储的数据。
变量管理基本类型的数据如下图:
变量管理引用类型的数据如下图:
(三)变量的命名、定义和初始化
1.变量的命名
1)首字母是英文字母、$或下划线,由字母、数字、下划线组成;
2)变量的命名遵循见名知义的原则;
3)Java变量名建议不用中文(不利于不同平台不同操作系统的移植);
4)变量名首字母建议不用大写字母;
5)用驼峰命名法命名多个单词组成的变量名。例如:sumScore;
6)变量名不要使用Java关键字。
2.变量的定义
每个变量必须属于一种数据类型。
类型 变量名1,变量名2,……,变量n;
3.变量的初始化
(四)用变量简化计算
(五)变量的作用域
1.Java用一对大括号作为语句块的范围,称为作用域;
2.作用域的变量不能重复定义;
3.离开作用域,变量所分配的内存空间将被JVM回收。
(六)基本数据类型的包装类
1.概述
Java为基本数据类型提供了对应的类,这些类称作包装类,如下表:
2.为什么使用包装类
包装类中封装了一些很实用的方法和常量。例如:Byte.MIN_VALUE是Byte类中的一个常量,存放了byte类型数据的最小值。
包装类在集合中用来定义集合元素的类型。
3.包装类中的常用方法和常量
Interger.MIN_VALUE:int类型的最小值
Interger.MAX_VALUE:int类型的最大值
int Integer.parseInt(String sInterger); 将字符串类型的整数装换为int类型的数据。
String Interger.toBinaryString(int value);将十进制数转换为二进制,返回结果String类型。
String Interger.toHexString(int value);将十进制数转换为十六进制,返回结果String类型。
(七)二进制补码
概述:计算机内部以二进制形式存储数据。Java程序中输入的十进制数据会被自动转换为二进制,Java内部也以二进制进行数值运算,但返回的结果是十进制。
1.补码规则
计算机系统中,数值一律用二进制补码来存储。
二进制最高位是符号位,0表示整数,1表示负数。
正数的值是其本身,负数的值是最高位不变,其他位逐位取反,再加1。例,二进制1101代表-3。
两数相加,若最高位有进位,则进位被舍弃。例如,4位二进制补码中,5-3的结果是2。
2.为什么使用补码
可以将符号位和其它位统一处理;
最高位不再表示数值,而是作为符号位,正好将数值折半,即一半是0至正数,一半是负数;
减法也可按加法处理。
3.补码运算的特征
计算机中正数和负数的关系是取反加1;
补码运算是封闭的,运算结果保留在补码范围之内,超范围就溢出;
4位二进制补码最多能表示2^4(16)个数,数的范围是-8到7;
8位二进制补码最多能表示2^8(256)个数,数的范围是-128到127;
16位二进制补码最多能表示2^16(65536)个数,数的范围是-32768到32767;
32位二进制补码最多能表示2^32个数,数的范围是-2^31到2^31-1。
4.补码运算的原理
正数+负数=模。模:某种类型数据的总数。
负数=模-正数,结果正好是正数逐位取反加1。
(八)整数类型
1.Java有四种整数类型:byte、short、int、long。
2.Java默认整数计算的结果是int类型。
3.整数的字面量是int类型。
4.若字面量超过int类型的最大值,则字面量是long类型,那么后面要用L(或l)表示该值是long类型。
示例,将字面量30亿赋值给一个long类型的变量:long longValue = 3000000000L。
5.java底层byte和short按照32位(int类型)计算。
(九)浮点类型
1.概述
浮点类型用于表示小数的数据类型;
原理:也就是二进制科学计数法;
有float和double两种类型;
默认浮点类型计算结果是double类型,字面量也是double类型;
若要给float类型的变量赋字面量的值,则要在字面量后面加F(或f)。
2.浮点类型的科学计数法
十进制浮点数科学计数法:219345=2.19345*(10^5) 尾数:2.19345,指数:5,基数:10。
二进制浮点数科学计数法:10111=1.0111*(2^100)
3.float类型
float类型共32位,1位符号位,指数8位,尾数23位。
float的精度是23位,即能精确表达23位的数,超过就被截取了。
小数是以尾数长度来表示精确度的,比如pi=3.1415的精度是4位。
float存储数据的范围大于int类型,但精度比int要小,int精度是31位。
4.double类型
double类型共64位,1位符号位,11位指数,52位尾数。
double范围远远大于long,但double精度不如long(long存储数据的位数是63位)。
5.浮点运算的特点
浮点运算就是实数运算,由于计算机只能存储整数,所以实数都是约数,这样浮点运算是很慢的而且会有误差。
(十)字符类型
1.概述
char类型的字面量可以是一个英文字母、字符或一个汉字,用单引号包括。
Java底层使用一个16位的整数来处理字符类型,该数值是一个字符的unicode编码值。
2.unicode编码
是全球范围内的编码方法。
英文部分与ASCII码兼容(ASCII表示范围0~128),同时英文字符和数字是连续编码的。
Java在处理char类型的数据时,底层是按unicode码来处理的。
3.计算机硬件系统只能用0和1表示数,我们人为做了规定,某个数还可以表示一个字符,例如,65代表字符A。
(十一)转义符
"\",通过转义字符,可表示一些特殊的字符。
‘\n’ '\t' '\\' '\'' '\"'
'\u4e2d'表示unicode编码对应的字符(汉字:中)。
(十二)布尔类型
blloean类型用来表示肯定或否定两种可能。
常用在分支语句、循环语句中。
true,false
(十三)小类型向大类型转换
小类型向大类型转换会自动完成,不需要程序员编写代码,有JVM负责,自动类型转换也叫“隐式类型转换”
自动转换的规则:符号位自动扩展,负数补1,正数补0。
byte -> short -> int -> long -> float -> double
int和char类型数据在某些情况下可以自动相互转换。
整数到浮点数转换会损失精确度。
小类型向大类型转换一般情况下是安全的。
当小类型的精度高于大类型时要注意精度丢失的隐患。
int类型转换为float类型可能丢失精度。(int类型数据超过float类型尾数23位时)
long类型转换为double类型可能丢失精度。(long类型数据超过double类型尾数52位时)
(十四)大类型向小类型转换
即强制类型转换,简称强转。
强制类型转换时,要注意边界数风险问题。
大类型转换为小类型时,源数据的数据位变为目标数据的符号位。
大类型的数据超过了小类型的位数。
(十五)int类型与char类型的转换
Java对char类型的数据在底层是按int类型处理的。
int类型与char类型在赋值时自动转换。char c = 65; int i = ‘B’;
字符类型的数据可进行数值计算。
(十六)通过args数组获取数据
通过main方法的args数组可以从控制台获取一组字符串数据。
运行程序时,run--run configurations--arguments中添加数据。
(十七)通过Scanner从控制台获取数据
Scanner类用于扫描从控制台输入的数据,可以接收字符串和基本数据类型的数据。
Scanner类位于java.util.Scanner包中。
Scanner类的常用方法:
String next():接收控制台输入的一个字符串,以空格或回车作为一次输入的结束,不可以接收空格。
String nextLine():接收控制台输入的一个字符串,以回车作为一次输入的结束,可以接收空格。
int nextInt():接收控制台输入的一个int类型的数据。
double nextDouble():接收控制台输入的一个double类型的数据。
boolean nextBoolean():接收控制台输入的一个boolean类型的数据。
输入char类型的数据:
Scanner类没有提供直接输入char类型的方法,可以通过charAt()方法从next()或nextLine()获取输入的字符。
char String.charAt(int index):从字符串中获取指定下标的字符,下标从0开始。例,“abc”.charAt(0)结果是a。
next().charAt(0):从控制台输入的字符串中获取第一个字符。
实现步骤:
1)创建Scanner类的一个对象。
Scanner scanner=new Scanner(System.in);
2)通过scanner调用next等方法,接收控制台输入的数据。
System.out.println("姓名:");
String name=scanner.next();
(十八)变量的自增、自减、自乘、自除
字符串类型变量的自增:String space=“”; space=space+" "; 简写 space+=“ ”;
(十九)交换两个变量的值
两个变量值互换是基本的算法,在排序等算法中应用。
1)int c=a; a=b;b=c;
2)不借助第三个变量,仅在两个变量之间交换值。 a=a+b; b=a-b; a=a-b;
(二十)Java的错误类型
编译期语法错误、运行期异常错误和运行期逻辑错误。
1)编译期语法错误:可借助Eclipse的帮助方便地定位错误,并进行修改。
2)运行期异常:系统会提示错误的类型和出错的位置。
3)逻辑错误:程序可以编译运行,但程序执行的结果不是预期的效果。
(二十一)Debug调试
调试是查找、解决软件中逻辑错误代码(成为bug:软件臭虫)的重要手段,是软件开发中必不可少的环节。
调试也是学习、研究其他人编写的代码的一个很好的手段。
Eclipse提供了强大的代码调试功能-Debug,通过Debug视图能快速定位代码中的逻辑错误,提供软件开发效率。
断点是在源代码可执行部分的指定行设置一个标志,在调试运行方式下,程序运行到该断点标志处会自动暂停,等待下一步操作。
通过设置断点可以快速执行断点之前的代码,然后在断点处暂停,这时可以换单个命令运行的方式来运行程序,查找程序中的逻辑错误。
断点设置的位置应是程序员怀疑错误代码的附近位置,即对出错位置的定性分析,是一个大概的位置。