:Java常量数据类型变量类型转换类型提升和字符串
Posted 快乐江湖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了:Java常量数据类型变量类型转换类型提升和字符串相关的知识,希望对你有一定的参考价值。
文章目录
一:Java字面常量
字面常量:程序运行期间固定不变的量,主要有
- 字符串常量:由
“”
括起来的;如"123"
、"HelloWorld"
、"生活"
- 整型常量:也即整数;如
100
、9999
- 浮点数常量:也即小数;如
3.14
、0.985
- 字符常量:由
''
括起来的单个字符;如'A'
、'2'
- 布尔常量:也即
true
和false
- 空常量:也即
null
需要注意:字符串、整型、浮点型、字符型和布尔型在Java中称之为数据类型
二:Java数据类型
数据类型:数据类型是用来定义变量的,它规定了一个变量占用的空间大小,Java中的数据类型分为以下两类
- 基本数据类型
- 引用数据类型
(1)基本数据类型
基本数据类型见下表,需要注意
-
每个基本数据类型都会对应一个类类型,也即包装类
-
无论是16位还是32位系统,int都占用4个字节,long都占用8个字节
-
整型和浮点型都是有符号的(意思就是肯定有正负)
-
整型默认为
int
,浮点型默认为double
-
计算机使用 二进制(bit) 表示数据
-
字节(Byte)是计算机中表示空间大小的基本单位,1B=8bit
数据类型 | 关键字 | 大小 | 范围 | 包装类 |
---|---|---|---|---|
字节型 | byte | 1字节 | -128~127 | Byte |
短整型 | short | 2字节 | -32768~32767 | Short |
整型 | int | 4字节 | -231~ 231-1 | Integer |
长整型 | long | 8字节 | -263~263-1 | Long |
单精度浮点数 | float | 4字节 | 有 | Float |
双精度浮点数 | double | 8字节 | 有 | Double |
字符型 | char | 2字节 | 0~65535 | character |
布尔型 | boolean | 无明确规定 | true或false | Boolean |
(2)引用数据类型
- 例如数组、
String
、类等;具体内容后面会探讨
三:变量
变量及赋值:除常量外,生活中更多见的是变量(比如人的年龄就处在不断变化之中);可以把变量想象成一个箱子,这个箱子可以装特定的东西(例如苹果箱子规定只能装苹果),而箱子的大小则由数据类型决定,箱子的名字就叫做变量名,即数据类型 变量名=数值,在赋值时需要注意
- 变量在使用前必须初始化,否则无法运行(Java对数据类型的检查非常严格)
- 给变量赋的值不能超过该类型变量所规定的的范围,否则溢出
- 在方法内部定义的变量叫做局部变量、外部定义的是成员变量
(1)整型变量
A:int
需要注意
- 无论在何种系统下,
int
都是4个字节 int
的包装类型为integer
int
范围为:-231~ 231-1- case1:建议使用这种方式
- case3:通过
integer
的MAX_VALUE
和MIN_VALUE
可以得到整型的最大和最小值 - case4:定义时未初始化或超出
int
范围,Java会直接报错
public class TestDemo
public static void main(String[] args)
//case1:在定义时给出初值
int a = 10;
System.out.println(a);
System.out.println("---------------------------------------------");
//case2:先定义后赋值
int b;
b = 20;
System.out.println(b);
System.out.println("---------------------------------------------");
//case3:输出最大和最小值
System.out.println("最大值"+Integer.MAX_VALUE);
System.out.println("最小值"+Integer.MIN_VALUE);
//case4:定义时未初始化或者超过范围,Java将直接报错,非常安全
/*
int c = 9999999999999999999999999999999999;//error
int d;
System.out.println(d);//error
B:long
需要注意
- 无论在何种系统下,
long
都是4个字节 long
的包装类型为Long
long
范围为:-263~ 263-1- case2:建议使用这种方式初始化,以区分
int
- case3:通过
Long
的MAX_VALUE
和MIN_VALUE
可以得到长整型的最大和最小值
public class TestDemo
public static void main(String[] args)
//case1
long a = 100;
System.out.println(a);
System.out.println("--------------");
//case2:初始化时为了进行区分,建议在后面加L
long b = 100L;
System.out.println(a);
System.out.println("--------------");
//case3:输出最大和最小值
System.out.println("最大值"+Long.MAX_VALUE);
System.out.println("最小值"+Long.MIN_VALUE);
C:short
需要注意
- 无论在何种系统下,
short
都是2个字节 short
的包装类型为Short
short
范围为:-215~ 215-1- case2:通过
Short
的MAX_VALUE
和MIN_VALUE
可以得到短整型的最大和最小值
public class TestDemo
public static void main(String[] args)
//cas1:
short a = 10;
System.out.println(a);
//case2:
System.out.println("最大值"+Short.MAX_VALUE);
System.out.println("最小值"+Short.MIN_VALUE);
D:byte
需要注意
- 无论在何种系统下,
byte
都是1个字节 byte
的包装类型为Byte
byte
范围为:-128~127- case2:通过
Byte
的MAX_VALUE
和MIN_VALUE
可以得到byte的最大和最小值
public class TestDemo
public static void main(String[] args)
//cas1:
byte a = 10;
System.out.println(a);
//case2:
System.out.println("最大值"+Byte.MAX_VALUE);
System.out.println("最小值"+Byte.MIN_VALUE);
这里再补充一点,如下代码看似是没有错误的,因为变量b
的结果是11,并没有超过byte
的范围,但编译器却报出了错误
这是因为变量a
的确是byte
型的,但在Java中整型字面常量默认为int
,整型提升后变量a+1
自然就变为了int
型,类型不正确。正确写法如下
(2)浮点型变量
A:float
需要注意
- 无论在何种系统下,
float
都是4个字节 float
存储遵守IEEE 754标准,更多可点击了解:(计算机组成原理)第二章数据的表示和运算-第三节2:IEEE754标准- 不推荐使用
float
,因为其范围较小,常用的还是double
float
包装类型为Float
- case1:由于浮点型字面常量默认为
double
,所以在定义时后面必须加f
或F
,否则无法编译通过
public class TestDemo
public static void main(String[] args)
//cas1:
float a = 3.14F;
System.out.println(a);
B:double
- 无论在何种系统下,
double
都是8个字节 double
存储遵守IEEE 754标准,更多可点击了解:[(计算机组成原理)第二章数据的表示和运算-第三节2:IEEE754标准]double
包装类型为Double
- case2:Java中,
int
与int
相除是不会得到double
的,除非两个都是double
(或者让其中一个暂时变为小数) - case3:在计算机中某些小数是无法用二进制精确表示的,所以很多时候计算的结果会和我们想象的存在误差(具体见:(计算机组成原理)第二章数据的表示和运算-第一节1:一文总结进制转换,妈妈再也不用担心我不会进制转换了)
public class TestDemo
public static void main(String[] args)
//case1:
double a = 3.14;
System.out.println(a);
//case2:
int b1 = 1;
int c1= 2;
System.out.println(b1/c1);//不等于0.5,等于0
double b2 = 1;
double c2 = 2;
System.out.println(b2/c2);//等于0.5
System.out.println(b1*1.0/c1);//这样也是0.5
//case3:
double d = 1.1;
System.out.printf("%.20f", d*d);
(3)字符型变量
需要注意
-
char
的包装类型为Character
-
char
范围为:0~65535 -
case1:计算机中的字符本质上是一个整数。在C语言中使用ASCII表示字符,而Java中使用Unicode表示字符。因此一个字符占用两个字节,表示的字符种类更多,包括中文(具体见((计算机组成原理)第二章数据的表示和运算-第一节3:字符与字符串在计算机中的表示详解))
-
case2:字符可以存放整数(显示时会显示为整数对应的字符;不能是负数)
public class TestDemo
public static void main(String[] args)
//case1
char a = 'a';
char b ='6';
System.out.println(a);
System.out.println(b);
//case2
char c = 97;
System.out.println(c);
(4)布尔型变量
需要注意
- 在Java中
boolean
类型只有两种取值:ture
和false
(没有所谓的0是假非0是真的说法) boolean
的包装类型为Boolean
boolean
并没有规定它的大小
public class TestDemo
public static void main(String[] args)
//case1
boolean flg = true;
System.out.println(flg);
四:Java类型转换
类型转换:Java是一门强类型编程语言,在进行变量赋值时会有严格的类型检查,检查不通过编译也会失败,如下
- 在C/C++中顶多会给你一个
warning
,很不安全
public class TestDemo
public static void main(String[] args)
int a = 10;
long b = 100L;
b = a;//编译通过
a = b;//编译失败,4字节存不了8字节的
如果编译可以通过,那么当数据类型不一致时就会进行类型转换,分为两类
- 自动类型转换(隐式)
- 强制类型转换(显式)
(1)自动类型转换(隐式)
自动类型转换(隐式):即代码不需要经过任何处理,在编译时编译器自动进行转换;典型特征就是数据范围小的转数据范围大的
public class TestDemo
public static void main(String[] args)
//case1:
int a = 10;
long b = 100L;
b = a;//编译通过;4字节转向8字节
a = b;//编译失败;8字节转向4字节会丢失
//case2:
float f = 3.14F;
double d =5.12;
d = f;//编译通过;4字节转向8字节
f = d;//编译失败;8字节转向4字节会丢失
//case3:
byte b1 = 100;//编译通过;未超过byte范围,会将int下的100转化为byte
byte b2 = 257;编译失败;超出范围,数据丢失
(2)强制类型转换(显式)
强制类型转换(显式):操作时,代码需要一定的格式处理,一旦强转意味着程序员需要为此次转换负责;典型特征就是数据范围大的转数据范围小的
- 注意:强转不一定成功,两个不相干的类型不能强转
public class TestDemo
public static void main(String[] args)
//case1:
int a = 10;
long b = 100L;
b = a;//编译通过;4字节转向8字节
a = b;//编译失败;8字节转向4字节会丢失
a = (int)b;//强转
//case2:
float f = 3.14F;
double d =5.12;
d = f;//编译通过;4字节转向8字节
f = d;//编译失败;8字节转向4字节会丢失
f = (float)d;//强转
//case3:
byte b1 = 100;//编译通过;未超过byte范围,会将int下的100转化为byte
byte b2 = 257;编译失败;超出范围,数据丢失
byte b3 = (byte)257;//强转
五:类型提升
类型提升:不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的
①:int
与long
运算时int
会被提升为long
public class TestDemo
public static void main(String[] args)
int a = 10;
long b = 20;
int c = a + b;//编译错误,此时等式右边是long
long d = a + b;
②:byte
与byte
运算时,各自都会提升为int
- 其实:计算机为了硬件实现方便,对于低于4字节的类型,都会先提升int再参与运算
public class TestDemo
public static void main(String[] args)
byte a = 10;
byte b = 20;
byte c = a + b;//编译错误,右面成了int了
byte d = (byte)(a+b);//编译通过
六:字符串类型
- 简单来说,它就是一个类,这个类给你封装好了很多借口,让你便于操作
和C++一样,Java中也适用String
来定义字符串
public class TestDemo
public static void main(String[] args)
String s1 = "hello";
String s2 = "world";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1+'-'+s2);
很多时候,String
和int
之间会经常相互转换,在Java中也是非常容易做到
public class TestDemo
public static void main(String[] args)
//int转换为String
int num = 10;
String intToString = String.valueOf(num);
//String转换为int
String str = "100";
int stringToInt = Integer.parseInt(str);
System.out.println(intToString);
System.out.println(stringToInt);
关于String
类后面还会继续深入研究
以上是关于:Java常量数据类型变量类型转换类型提升和字符串的主要内容,如果未能解决你的问题,请参考以下文章