Java基础知识之了解变量、常量,掌握数据类型,类型转换,数值提升,int和String相互转换

一、变量和类型概念

变量指的是程序运行时可变的量。相当于开辟一块内存空间来保存一些数据。
类型则是对变量的种类进行了划分, 不同的类型的变量具有不同的特性。
其中, “变量” 主要和 “内存” 这样的硬件设备密切相关,如下图所示:
在这里插入图片描述
Java 的数据类型有基本数据类型和引用数据类型:
在这里插入图片描述

二、变量

(1)变量的作用域
指该变量能生效的范围,一般是变量定义所在的代码块,如下列代码所示int在括号中被定义,括号外面则不能对其操作:

public class TestDay {
    
    
    public static void main(String[] args) {
    
    
        {
    
    
            int m =30;
        }
        System.out.println(m);//编译报错
    }
}

(2)命名规则

  1. 一个变量名只能包含数字, 字母, 下划线,数字不能开头。
  2. 变量名区分大小写,即 Sum 和 sum 是两个不同的变量。
    注意:虽然语法上也允许使用中文/美元符($)命名变量, 但是强烈 不推荐这样做。
  3. 变量命名要具有描述性, 见名知意;变量名不宜使用拼音;变量名的词性推荐使用名词。
  4. 变量命名推荐“小驼峰”命名法, 当一个变量名由多个单词构成的时候, 除了第一个单词之外, 其他单词首字母都大写,小驼峰命名示例如下:
int maxValue = 100;
String studentAge = "23";

三、常量

java中每种类型的变量对应着一种相同类型的常量。
常量指的是运行时类型不能发生改变。
常量主要有种体现形式,字面值常量和 final 关键字修饰的常量。
(1)字面值常量

18 // int 字面值常量(十进制)
022 // int 字面值常量(八进制) 由数字 0 开头. 022 也就是十进制的 18
0x12 // int 字面值常量(十六进制) 由数字 0x 开头. 0x12 也就是十进制的 18
18L // long 字面值常量. 也可以小写l
18.0 // double 字面值常量. 也可以写作 18.0d 或者 18.0D
2.5e3 // double 字面值常量. 科学计数法表示. 相当于 2.5 * 10^3
1.0f // float 字面值常量, 也可以大写F
true // boolen 字面值常量, 同样的还有 false
'a' // char 字面值常量, 单引号中只能有一个字符
"abc" // String 字面值常量, 双引号中可以有多个字符.

(2)final 关键字修饰的常量
常量不能在程序运行过程中发生修改,如下代码返回的编译错误是无法为最终变量m分配值:

final char m = 'a';
char m = 20;

结果错误显示:
在这里插入图片描述

四、java中的数据类型

1 整型变量(重点)

(1) 基本语法格式:

int 变量名 = 初始值;

代码表示如下:

扫描二维码关注公众号,回复: 14714087 查看本文章
int a = 50;//定义整型变量
System.out.println(a);

注:

  • Java 中 “= ”表示赋值, 意思是给变量设置一个初始值。
  • 建议创建变量的时候显式初始化。
  • 在 Java 中, 一个 int 变量占 4 个字节. 和操作系统没有直接关系。

字节是计算机中表示空间大小的基本单位。计算机中一个字节为8个二进制位。
其中 1KB = 1024 Byte, 1MB =1024 KB, 1GB = 1024 MB。
8GB 相当于 80 多亿个字节。

(2)4 个字节表示的数据范围是 -2^31-> 2^31-1 ,求int数据范围如下代码所示:

public static void main(String[] args) {
    
    
        //求int的最大、最小值
        System.out.println(Integer.MAX_VALUE);
        System.out.println(Integer.MIN_VALUE);
    }

运行结果如下:
在这里插入图片描述
如果运算结果超出 int 最大范围, 就会出现溢出的情况。如下代码所示:

int max = Integer.MAX_VALUE;
System.out.println(max+1);
int min = Integer.MIN_VALUE;
System.out.println(min-1);

运行结果如下:
在这里插入图片描述

2 长整型变量

(1)基本语法格式:

long 变量名 = 初始值;

代码表示如下:

long m = 6L; //定义长整型变量,大小写都可
System.out.println(m);

(2)求Java中long数据范围如下代码所示:

System.out.println(Long.MAX_VALUE);
System.out.println(Long.MIN_VALUE);

运行结果如下:
在这里插入图片描述

3 浮点型变量

浮点型分为双精度double和单精度folat,其中双精度数double是重点掌握。
(1)双精度浮点型变量的基本语法格式:

double 变量名 = 初始值;

代码表示如下:

double m = 2.3;
System.out.println(m);

(2)双精度浮点型变量(重点)
在整型类型中,int值处以int值的结果仍然是int,所以会舍弃小数部分,如下面的代码两个int值相除,得到的结果是0。如果想到得到结果0.5,则需要使用double类型计算。代码如下:

int m = 3;
int n = 6;
System.out.println(m/n);//运行结果为0

double a = 3.0;
double b = 6.0;
System.out.println(a/b);//运行结果为0.5

Java 中 double 是 8 个字节, 但是浮点数的内存布局和整数差别很大,不能单纯的用 2 ^ n 的形式表示数据范围。如下列代码表示两个double数相乘:

double m = 2.2;
System.out.println(m * m)

运行结果如下:
在这里插入图片描述
Java 的 double 类型的内存布局遵守 IEEE 754 标准(和C语言一样),尝试使用有限的内存空间表示可能无限的小数, 势必会存在一定的精度误差。
(3)单精度浮点型变量的基本语法格式:

float 变量名 = 初始值;

代码表示如下:

float m = 2.3f; 
System.out.println(m);

Java的float 类型占四个字节,遵守 IEEE 754 标准。由于表示的数据精度范围较小,一般在工程上用到浮点数都优先考虑 double, 不太推荐使用 float。

4 字符类型变量

基本语法格式:

char 变量名 = 初始值;

代码表示如下:

char ch = 'H';//Java 中使用单引号+ 单个字母的形式表示字符字面值。
System.out.println(ch);

5 字节类型变量

(1)基本语法格式:

byte 变量名 = 初始值;

代码表示如下:

byte m = 3;
System.out.println(m);

(2)字节类型表示整数,占一个字节。字节类型和字符类型互不相干,字节类型表示范围如下代码所示:

System.out.println(Byte.MAX_VALUE);//运行结果:127
System.out.println(Byte.MIN_VALUE);//运行结果:-128

6 短整型变量

(1)基本语法格式:

short 变量名 = 初始值;

代码表示如下:

short m = 0;
System.out.println(m);

(2)short 占两个字节, 表示的范围如下代码,因为范围比较小, 一般不推荐使用。

System.out.println(Short.MAX_VALUE);//运行结果:32767
System.out.println(Short.MIN_VALUE);//运行结果:-32768

7 布尔类型变量

(1)基本语法格式:

boolean 变量名 = 初始值;

(2)boolean 类型的变量只有两种取值,true 表示真,false 表示假。
Java 的 boolean 类型和 int 不能相互转换, 即不存在 1 表示 true, 0 表示 false 这样的用法。如下所示不能进行运算:

boolean m = true;
System.out.println(m + 1);

代码编译会出现错误:
在这里插入图片描述

boolean 类型有些 JVM 的实现是占 1 个字节, 有些是占 1 个比特位, 没有明确规定。

8 字符串类型变量(重点)

(1)基本语法格式:

String 变量名 = “初始值”;

代码表示如下:

String m = "blue";
System.out.println(m);//运行结果:blue

(2)java中使用“双引号”+若干字符的方式表示字符串的字面值。String不是基本类型,而是引用类型,下面有讲述到。
(3)字符串中的一些特定的不能直接表示的字符需要转义字符。如下代码所示:

String m = "反斜杠的表示是\\";//
String n = "我的名字是\"sendy\"";
System.out.println(m);
System.out.println(n);

运行结果:
在这里插入图片描述
常见的转义字符有:

转义字符 表示
\’ 单引号
\" 双引号
\\ 反斜杠
\n 换行
\t 水平制表符

(4)字符串的拼接使用“+”操作,如下:

 String X = "千树";
 String Y = "万树";
 String Z = "梨花开";
 String n = "。";
 String m = X + Y + Z + n;
 System.out.println(m);//运行结果:千树万树梨花开。

同时,还可以用字符串和整数进行拼接,如下代码所示:

int a = 2;
int b = 4;
String m = "splicing = ";
String n = m + a + b;
System.out.println(n);//运行结果:sum = 24

五、类型转换

Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有严格的校验。
int 和 long/double 相互赋值:

int a = 2;
long b = 3;
a = b; // 编译出错,long表示的范围比int大,不能将long赋值给int。
b = a; // 编译通过。

int m = 20;
double n = 1.0;
m = n; // 编译出错,double表示的范围比int大,不能将double赋值给int。
n = m;//编译通过。

结果错误显示:
在这里插入图片描述
结论:不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型, 反之则不行。
int 和 boolean 相互赋值:

int m = 10;
boolean n = true;
m = n; // 编译出错,提示不兼容的类型:int无法转换为boolean
n = m; // 编译出错, 提示不兼容的类型:boolean无法转换为int

结论:int 和 boolean 不能相互赋值。
int字面值常量给byte赋值:
byte 数据范围是 -128 -> +127,如下代码,127在byte范围内,但是128超过范围:

byte a = 127; // 编译通过
byte b = 128; // 编译报错

错误结果显示:
在这里插入图片描述
结论:使用字面值常量赋值的时候, Java 会自动进行一些检查校验, 判定赋值是否合理。
使用强制类型转换

int a = 3;
double b = 34.9;
a = (int)b;//使用 (类型) 的方式可以将 double 类型强制转成 int。
        
int m = 2;
boolean n = false;
n = (boolean)m;//编译出错,提示不兼容的类型:int无法转换为boolean。

结论:1.强制类型转换可能会导致精度丢失。如上面例子中, 赋值之后, 34.9 就变成 34, 小数点后面的部分被忽略。
2. 强制类型转换不是一定能成功, 互不相干的类型之间无法强转,如上述int与boolean类型。
类型转换小结

  1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型。
  2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失。
  3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查。

六、数值提升

int 和 long 混合运算
当 int 和 long 混合运算的时候,int 会提升成 long, 得到的结果仍然是 long 类型, 需要使用 long 类型的变量来接收结果,如果使用int类型变量接收则会编译报错,如下代码所示:

int a = 1;
long b = 2;
int c = a + b; // 编译出错, 提示:从 long 转换到 int 可能会有损失
long d = a + b; // 编译通过.

如果非要用 int 来接收结果, 就需要使用强制类型转换,如下图:
在这里插入图片描述
byte 和 byte 的运算
byte 和 byte 都是相同类型, 但是出现编译报错。如下代码所示 ,m 和 n 都是 byte, 但是计算 m + n 会先将 m 和 n 都提升成 int, 再进行计算, 得到的结果也是 int, 再赋给 a, 就会出现编译错误:

byte m = 23;
byte n = 22;
byte a = m + n;
System.out.println(a);

编译错误显示:
在这里插入图片描述
正确写法,将m和n的结果先转换为byte类型再赋给a,如下:
在这里插入图片描述
结论:
由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据。 为了硬件上实现方便, 诸如 byte 和 short 这种低于4 个字节的类型, 会先提升成 int, 再参与计算。
类型提升小结:

  1. 不同类型的数据混合运算, 范围小的会提升成范围大的。
  2. 对于 short, byte 这种比 4 个字节小的类型, 会先提升成 4 个字节的 int , 再运算。

七、int 和 String 之间的相互转换

(1)int 转成 String
有两种方法实现:

int m = 23;
String str1 = m + "";// 方法1
String str2 = String.valueOf(m);//方法2

(2)String 转成 int
有两种方法实现:
1)Integer.parseInt(String)方法
parseInt()是Integer包装类里的方法,可以将字符串解析为带符号的整数。

String str = "23";
int m = Integer.parseInt(str);
m += m;
System.out.println(m);

运行结果:
在这里插入图片描述
在parseInt()方法中,字符串中除第一个可以是负号,其他必须是数字,如下所示str1的值会转换变量str1进行运算:

String str1= "-23";
int m = Integer.parseInt(str1);
m += m;
System.out.println(m);

运行结果:
在这里插入图片描述
反之,如果字符串里的字符部分是数字,则Integer.parseInt()将会抛出一个异常(数字格式异常),如果将上面程序字符串str1的值改为“-23ab”,则会出现编译报错:
在这里插入图片描述
2)Integer.valueOf(String)方法
valueOf()也是Integer包装类里的方法,可以将String类型的值转换为int类型值。和parseInt(String)方法相同的是字符串中除第一个可以是负号,其他必须是数字。
它两的区别在于parseInt(String)方法返回原始的int值,valueOf(String)方法会返回Integer类的对象。

 String str1= "-23";
 int m = Integer.valueOf(str1);
 m *= m;
 System.out.println(m);

运行结果:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lolly114/article/details/127572718