1. 数据类型划分
1.1 java数据类型划分(牢记
)
在java中数据类型分为两大类:
数据类型 | 表示 | 默认值 | ||
---|---|---|---|---|
基本数据类型 | 数值型:表示整数或小数 | |||
整型 | byte、short、int、long | 0 | ||
浮点型 | float、double | 0.0 | ||
字符型 | char | ‘\u0000’ | ||
布尔型 | boolean | false | ||
引用数据类型 | 数组、类、接口 | null |
基本数据类型有可表示的数据范围:
- byte:-128~127
- int:-2147483648~2147483647
数据类型选择原则:
- 在程序开发中,整数选择int,描述小数使用double
- long一般描述日期时间、内存或文件大小(字节)
- 若需要进行编码转换或进行二进制传输,使用byte
- char一般在描述中文的时候使用
- boolean在描述程序逻辑时使用
1.2 整型
在Java程序中任何一个整数的常量类型都是整型。
范例:定义一个整型变量
代码
public class Test{
public static void main(String args[]){
//10是一个整数(不会改变的数据是常量)
//程序之中任何一个整数对应的类型都是int
int num= 10;//声明一个int型变量
//num是in图形变量*2是int型常量,int*int还是int
System.out.println(num*2);
}
}
数据溢出指:当已经达到了整型的最大或最小值,如果继续进行数学计算而可能产生的错误数据。 变量命名要求:第一个单词的字母小写,后面单词首字母大写,eg: maxValue
范例:观察溢出
代码:
public class Test{
public static void main(String args[]){
int maxValue = Integer.MAX_VALUE;//取得最大值
int minValue = Integer.MIN_VALUE;//取得最小值
System.out.println(maxValue);//2147483647
System.out.println(minValue);//-2147483648
System.out.println(maxValue+1);//-2147483648数据溢出为最小值
System.out.println(minValue -1);//2147483647数据溢出为最大值
}
}
- int 和 Integer区别简述:为了编程的方便引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每 一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer。int 是基本类型,直接存数值,进行初始化时int类的变量初始为0。Integer是对象,用一个引用指向这个对象,Integer的变量则初始化为null。
发现当已经超过了数据类型的局限之后,数据的计算会出现偏差,在操作前预估数据大小。int会存在溢出,需要解决溢出问题,解决方案只有更换更大的数据类型就是long类型。
范例:使用long解决int数据溢出问题
代码:
public class Test{
public static void main(String args[]){
int maxValue = Integer.MAX_VALUE;//取得最大值
int minValue = Integer.MIN_VALUE;//取得最小值
System.out.println(maxValue);//2147483647
System.out.println(minValue);//-2147483648
long result = maxValue + 1;
System.out.println(result);//-2147483647
}
}
在使用此类发方式解决问题,要注意,程序的执行方式是由等号的右边到左边,如果继续使用int进行计算,计算结果依然会有溢出,首先将其中的一个变量做类型的扩充,而扩充的类型有两种实现方式:
- 直接将int变量的内容复制给long变量
代码
long result = maxValue;//将int的数据变量赋值给了long
//result为long,+1为int,long+int=long
System.out.println(result+1);//2147483648
- 直接将某一个int型的变量变为long型
代码
public class Test{
public static void main(String args[]){
int maxValue = Integer.MAX_VALUE;//取得最大值
int minValue = Integer.MIN_VALUE;//取得最小值
long result = (long)maxValue + 1;
System.out.println(result);//2147483648
}
}
数据类型可以由小变大,也可以实现由大变小:强制类型转换,强制的结果会丢内容。
范例:数据类型强制转换
代码
public class Test{
public static void main(String args[]){
// long num = 2147483648;
// 任何整数其默认类型都是int,但该数据已经超过了今天的范围
// 那么现在需要将这个数据明确的表示是一个long型的常量,在尾部加上L或l。
long num = 2147483648L;
// 在强制的时候设置其目标类型,这种操作有可能会丢失精度。
int result = (int) num;//大类型变小类型,必须强制
System.out.println(result);//-2147483647
}
}
在开发中没特殊需求不要强转
+ 范围小的数据类型可以自动变换为范围大的数据类型
+ 范围大的数据类型变为范围小的数据类型需要进行强制转换
说明
:关于数据类型默认值问题
所有数据类型都有其默认值,但是这个默认值在方法的声明中无效
范例:观察一个错误程序
代码
public class Test{
public static void main(String args[]){
int num;//定义一个num变量
System.out.println(num);//编译出错
}
}
两种解决方案:
- 在使用前进行赋值(在老版本JDK会出错)
代码
public class Test{
public static void main(String args[]){
int num;//定义一个num变量
num = 10;在num输出之前为其赋值
System.out.println(num);//输出10
}
}
- 在定义变量时进行赋值
代码
public class Test{
public static void main(String args[]){
int num = 10;//定义一个num变量,同时初始化
System.out.println(num);//输出10
}
}
byte数据类型(-128~127): 范例:声明byte
代码
public class Test{
public static void main(String args[]){
byte data = 10;
//10是int,int的范围大于byte,理论上需要强制类型转换,但这里没有转换,因为其数据量符合byte要求
System.out.println(data);//输出10
}
}
代码
public class Test{
public static void main(String args[]){
/* byte data = 128;
//大于byte
System.out.println(data);//错误:不兼容数据类型
*/
byte data = (byte) 128;
//大于byte,强转
System.out.println(data);//-128
}
}
`注意`如果要将int常量直接赋给byte变量,那么只能是int常量,不能是int变量。
代码
public class Test{
public static void main(String args[]){
int num = 10;
byte data = (byte) num;
System.out.println(data);//10
}
}
1.3 浮点类型
描述小数,默认数据类型使用double 定义小数:代码
public class Test{
public static void main(String args[]){
double num = 10.2;// 这是一个小数,默认类型为double
//num是double型 * 2 int型 = double型
// num * 2.0(由nt变为的double型)
System.out.println(num * 2);//-128
}
}
double可以保存的数字式最大的,也就是说double可以保存全宇宙中最大的有意义的数,除了double外也可用float描述小数,数据范围double>float,若直接声明float变量,要求在定义时进行强制转换:需要给数字后加上F或f,或在数字前加(float),如float f = 2.23f; float f = (float) 2.23;。
代码
public class Test{
public static void main(String args[]){
float f1 = 1.1f;
// float型*int常量 = float型
System.out.println(f1 * 2);// 2.2
System.out.println(1.1 * 1.1);//1.21000000000000002,传统bug
}
}
小数问题,考虑整型计算问题
代码
public class Test{
public static void main(String args[]){
int a = 10;
int b = 4;
// int / int = int
System.out.println(a/b); // 2,若要进行准确运算,则必须保证有一个double型或float型
System.out.println(a/(double)b); // 2.5
}
}
进行除法计算时,要注意数值类型。
1.4 字符型
会使用字符型的概念,但操作很少。 字符型使用char进行表示,使用单引号进行声明字符变量的内容,字符型可与int型互相转换。代码
public class Test{
public static void main(String args[]){
char c = 'A';// 定义字符
System.out.println(c); // A
}
}
麻烦在于,字符型可与int型互相转换,所有字符在程序中通过编码描述,char的变量变为int内容的时候,其所包含的就是编码。 范例:观察编码的出现
代码
public class Test{
public static void main(String args[]){
char c = 'A';// 定义字符
int num = c;// 将字符变为int型
System.out.println(num); // 65
}
}
常用范围:
- 大写字母(A-Z):65(A)~90(Z)
- 小写字母(a-z):97(a)~122(z)
- 字符数字(‘0’-‘9’):48(‘0’)~57(‘9’)
大小写字母转换(大写字母与对应的小写字母差32)
代码
public class Test{
public static void main(String args[]){
char c = 'A';// 定义字符
// char + int = int
int num = c + 32;// 将字符变为int型
System.out.println(c); // A
System.out.println(num); // 97
// int转char需要强制类型转换
char x = (char) num;
System.out.println(x); // a
}
}
实际上各个语言都有相似的编码,以前学的语言为ASCII码,而Java使用的是UNICODE编码,这种编码包含有ASCII码的部分内容,但它所包含的内容有多于ASCII码。UNICODE编码使用十六进制编码,这个编码可以保存任何的文字信息,包括中文。
范例:保存中文字符
代码
public class Test{
public static void main(String args[]){
char c = '周';
int num = c;
System.out.println(num); // 21608
int num2 = c + 32;
System.out.println((char) num2); //咈
}
}
由于Java中对char特性支持比较好,所以有神奇的用法。
范例:神奇的JAVA
代码截图:
结果
这样就打破了命名标识符,但是不要用。
1.5 布尔型
一般布尔类型表示逻辑观察结果
范例:观察布尔型的操作
代码
public class Test{
public static void main(String args[]){
boolean flag = 10 > 2;// true
if (flag) {// if语句需要使用布尔条件
System.out.println("true!"); //true!
}
}
}
关于布尔型内容的说明:
由于其他语言中没有布尔型的数据,会使用数字来描述布尔型,例如:0表示false,非0表示true,但是Java没有这样的概念,即boolean的值只有true和false,不能赋0,1。
1.6 初见字符串
char可以描述的只是单一的字符,但现在若想描述出多个字符,就必须利用字符串这一概念解决。例如定义表示人姓名的变量,很明显是多个字符,就必须使用String来描述。但是需要说明的是,String并不是基本数据类型,他是一个引用数据类型,但它的特殊在于可以使用基本数据类型的使用模式来进行套用。
范例:观察String型变量
- String变量上也可以使用‘+’,一旦使用了‘+’则描述的是两个个字符串的连接
代码
public class Test{
public static void main(String args[]){
String name = "lala";//定义了一个String
String note = "qlql";//定义了一个String
System.out.println(name + note); // lalaqlql
}
}
加号一般表示数学计算,但在String中表示字符串的连接,如果两类情况同时出现呢?
范例:观察‘+’问题
代码
public class Test{
public static void main(String args[]){
int numA = 10;
double numB = 20.1;
//此时不是数学计算,而是连接
String result = "数学计算:" + numA + numB ;
System.out.println(result); // 数学计算:1020.1
/*
String result = "数学计算:" + numA - numB ;
System.out.println(result); // 编译出错
*/
}
}
此时的计算结果为字符串的连接,一旦在在String中出现“+”,则String中所有的数据类型都变为String型。(所有类型只要与String发生“+”操作,都变为String类型后在连接)
如果想要得到正确的计算结果,就要使用括号来解决问题。
代码
public class Test{
public static void main(String args[]){
int numA = 10;
double numB = 20.1;
//此时不是数学计算,而是连接
String result = "数学计算:" +( numA + numB );
System.out.println(result); // 数学计算:30.1
}
}
在程序中有转义字符的概念:换行(\n),制表符(tab、\t),双引号(\”),单引号(\’),(\),转义字符用于控制字符串输出,在基础阶段有用,实际开发中没太大意义。
2 总结
1.现阶段所考虑的数据类型为:int ,double,boolean;
2.操作的数据请保证有意义,就刻意回避数据范围的问题;
3.使用"
声明的为字符串,字符串使用String来定义类型。