Java基础4-变量和数据类型(基本数据类型间转换)
一、变量
1.什么是变量?
*变量本质上说是内存中的一块空间,这块空间有数据类型,有名字,有字面值
*变量包含三部分:数据类型、名称、字面值【数据】
*变量是内存中存储数据的最基本的单元
内存空间得到了重复使用
定义变量的格式:
数据类型 变量名=初始化值;
public class variable { public static void main(String[] args){ int j=100; //数据类型:int 变量名:j 字面值为:100 System.out.println(j); } }
2.变量的分类
变量分为局部变量、成员变量
在方法体外【类体之内】声明的变量 称为成员变量。
在方法体中中声明的变量为局部变量。
public class variable { int c; // c为成员变量,在类体中声名,成员变量默认赋值 public static void main(String[] args){ int i; //变量i为局部变量,在方法体中声明,要赋值初始化否则 //编译报错:变量i没有初始化 i=100; //声明的变量可以重复赋值 for(int i=0;i<10;i++){ //在不同作用域中变量名可以相同 //java遵循就近原则 System.out.println(i); } System.out.println(i); } }
3.什么是作用域?
*变量的作用域描述的就是变量的有效范围
*在什么范围内可以被访问,出了这个范围不能访问
*变量作用域只要记住一句话:出了大括号就不认识了。
public class variable { int c; // c为成员变量,作用域为整个类 public static void main(String[] args){ int i; //变量i为局部变量,作用域为主方法中 i=100; //声明的变量可以重复赋值 for(int i=0;i<10;i++){ //在这个for循环中变量i只在这个循环中作用 //java遵循就近原则,这里打印输出for循环中定义的i System.out.println(i); } //这里打印输出主方法中声明的i 因为for循环中声明的i出了for循环这个作用域就无法访问到了 System.out.println(i); } }
二、数据类型
1.数据类型的种类
数据类型主要分为:基本数据类型和引用数据类型两种。
①基本数据类型(8种):
a数值型:
*整数型:(byte/short/int/long)
*浮点型:(float/double)
b字符型:char
c布尔型:boolean
②引用数据类型
*类
*数组
*接口
2.八种基本数据类型范围
NO. |
数据类型 |
大小/位 |
可表示范围 |
默认值 |
1 |
byte(字节) |
8 |
-128~127 |
0 |
2 |
short(短整型) |
16 |
-32768~32767 |
0 |
3 |
int(整型) |
32 |
-2147483648~2147483647 |
0 |
4 |
long(长整型) |
64 |
-9223372036854775808~9223372036854775807 |
0 |
5 |
float(单精度) |
32 |
-3.4E38~3.4E38 |
0.0 |
6 |
double(双精度) |
64 |
-1.7E308~1.7E308 |
0.0 |
7 |
char(字符) |
16 |
0~255 |
‘\u0000’ |
8 |
boolean(布尔) |
- |
true 或 false |
false |
3.数据类型的作用
*不同的数据有不同的类型,不同的数据类型底层会分配不同大小的空间
*数据类型是指导程序在运行阶段应该分配多大的内存空间。
4.java语言中的整数型
*java语言中,整数型字面值被默认当做int类型来处理。
要让整数型字面值被当做long类型来处理,需要在整数型字面值后面添加l/L,建议使用大写L
①java语言中整数型常量有三种表示方式
- 10进制
- 8进制,8进制以0开头,例如:012.
- 16进制,16进制以0x开头,例如:0x123.
5.基本数据类型之间的转换
1.除布尔类型外其他7种可以互相转换
2.小容量向大容量转换,自动类型转换
byte<short<int<long<float<double
char<
注:任何浮点类型不管占用多少个字节,都比整数型容量大。
char和short可表示的种类数量相同,但是char可以取更大的正整数
3.大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,程序才能编译通过,但是运行阶段会损失精度
4.当整数字面值没有超出byte,short,char的取值范围,可以直接赋值给byte,short,char
5.byte,short,char混合运算的时候,各自先转换成int类型再做运算
6.多种数据类型混合运算,先转换成容量最大的那种类型再做运算。
class note05 { public static void main(String[] args){ long x=456; //456整数型字面值被当做int类型 //x变量在声明时是long类型,占用8个字节 //int类型的字面值456赋值给long类型的变量x,存在类型转换 //从小容量转换成大容量自动转换 System.out.println(x); long y=2147483647; //2147483648被当做int类型,4个字节,但是字面值超过int类型范围需在后边加L //2147483648L是8个字节的long类型 long z=2147483648L; System.out.println(z); long v=100L; //100L是long类型字面值,v是long类型变量,不存在数据类型转换直接赋值 //int o=v; //从大容量转到小,不能直接赋值给小容量,所以int o=v不可以 int o=(int)v; //需要强制类型转换,需要加强制类型转换符将v转换成int类型再赋值给int类型的o //加上强制类型转换符编译可通过,但运行阶段可能损失精度 //强转原理: //原始数据:0000000 00000000 00000000 00000000 00000000 00000000 00000000 00100100 //强转之后的数据:00000000 00000000 00000000 00100100 //将左边的二进制砍掉,【所有数据都是这样完成的】 byte p=50; //没有超出byte类型取值范围的话,该字面值可以直接赋值给byte类型的变量。 /*关于浮点型数据类型 float 单精度【4个字节】 double 双精度【8个字节,精度较高】 double精度太低【相对来说】,不适合做财务软件。 涉及到财务,要求精度较高,所以sun在基础se类库中准备了精度更高的类型,是一种引用数据类型 它是:java.math.BigDecimal(欲知后事,请持续关注) java程序中sunsun提供了一套庞大的类库,java程序员是基于这套基础的类库来进行开发的 在java语言中,所有的浮点型字面值,默认被当作double类型来处理, 要想该字面值以float类型来处理,需要在字面值后面添加F/f 注意: double和float在计算机内部二进制存储的时候都是近似值。 */ double d=3.0; //3.0是double类型的字面值 //d是double类型 //不存在数据转换 System.out.println(d); //5.1是double类型的字面值 //f是float类型的变量 //大容量转换成小容量需要加强制类型转换符,所以以下程序编译错误 //解决方案 //float f=float(5.1); //第二种方式:没有类型转换 float f=5.1; } }
附常见基本数据类型转换的错误和注意点
class note06 { */ //出现错误,1000超出了byte的范围 //byte a = 1000; //正确,因为20没有超出byte范围 //所以赋值 byte a = 20; //变量不能重名 //short a = 1000; //正确,因为数值1000没有超出short类型的范围 //所以赋值正确 short b = 1000; //正确,因为默认就是int,并且没有超出int范围 int c = 1000; //正确,可以自动转换 long d = c; //错误,出现精度丢失问题,大类型-->>小类型会出现问题 //int e = d; //将long强制转换成int类型 //因为值1000,没有超出int范围,所以转换是正确的 int e = (int)d; //因为java中的运算会会转成最大类型 //而10和3默认为int,所以运算后的最大类型也是int //所以是正确的 int f = 10/3; //声明10为long类型 long g = 10; //出现错误,多个数值在运算过程中,会转换成容量最大的类型 //以下示例最大的类型为double,而h为int,所以就会出现大类型(long)到小类型(int) //的转换,将会出现精度丢失问题 //int h = g/3; //可以强制转换,因为运算结果没有超出int范围 //int h = (int)g/3; //可以采用long类型来接收运算结果 //long h = g/3; //出现精度损失问题,以下问题主要是优先级的问题 //将g转换成int,然后又将int类型的g转换成byte,最后byte类型的g和3运算,那么 //它的运算结果类型就是int,所以int赋值给byte就出现了精度损失问题 //byte h = (byte)(int)g/3; //正确 //byte h = (byte)(int)(g/3); //不能转换,还有因为优先级的问题 //byte h = (byte)g/3; //可以转换,因为运算结果没有超出byte范围 //byte h = (byte)(g/3); //可以转换,因为运算结果没有超出short范围 short h = (short)(g/3); short i = 10; byte j = 5; //错误,short和byte运算,首先会转换成int再运算 //所以运算结果为int,int赋值给short就会出现精度丢失问题 //short k = i + j; //可以将运算结果强制转换成short //short k = (short)(i + j); //因为运算结果为int,所以可以采用int类型接收 int k = i + j; char l = 'a'; System.out.println(l); //输出结果为97,也就是a的ascii值 System.out.println((byte)l); int m = l + 100; //输出结构为197,取得a的ascii码值,让后与100进行相加运算 System.out.println(m); } }
6.String字符砖类型
String字符串类型不属于基本数据类型,它是一个类,属于引用数据类型,
本质是一个字符类型的数组 char[] value={};以后再说。
String型的使用需要双引号""
String a="你好美女";
char b='国';
一个中文占用2个字节,char正好是占用两个字节。