首页 > 编程语言 >第四章: 全面梳理Java 标识符变量的声明,基本数据类型,String类型以及相互之间的类型转换

第四章: 全面梳理Java 标识符变量的声明,基本数据类型,String类型以及相互之间的类型转换

时间:2024-06-10 22:58:36浏览次数:17  
标签:类型转换 Java 变量 int 数据类型 System 类型 out String

1. 关键字和保留字

关键字(keyword)是指被Java语言赋予了特殊含义,用做专门用途的字符串(单词)

其特点就是关键字中所有字母都为小写

官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

保留字(reserved word) 是当前Java版本尚未使用, 但以后版本可能会作为关键字使用

例如goto,const

2. 标识符

标识符: Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符

标识符命名规则:

  1. 标识符由字母(26个英文字母大小写),数字(0-9)_ $ 组成
  2. 标识符不能以数字开头。
  3. 不可以使用关键字和保留字,但能包含关键字和保留字。
  4. Java中标识符严格区分大小写,长度无限制。
  5. 标识符最好见名知意

Java中命名规范
  1. 包名:多单词组成时所有字母都小写:xxxyyyzzz
  2. 类名、接口名:多单词组成时,采用大驼峰, 每个单词首字母都大写:XxxYyyZzz
  3. 变量名、属性名、方法名:多单词组成时,采用小驼峰, 除第一个单词,其他单词首字母大写:xxxYyyZzz
  4. 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

3. 变量

3.1 变量概念:

对于变量的理解

  1. 通过自定义名称(变量)来标识内存中的一个存储区域, 存储数据
  2. 该区域的数据可以在同一类型范围内不断变化
  3. 变量是 程序中最基本的存储单元, 构成包括三个要素包括类型, 变量名,和存储的值

变量的作用就是在内存中开辟一块区域, 用于保存数据

3.2 变量声明以及赋值

变量声明的语法

// 数据类型  变量名称
int count // 这里表示声明了一个int 类型的变量, 变量名称为 count

变量的赋值

// 使用 = 进行赋值
count = 20  // 表示将20赋值给变量count,

赋值可以理解为在count 变量对应的内存中存储了20这个数值

也可以在声明变量的时直接赋值

// 声明变量时直接赋值
int count = 20

java是一个强类型的语言, 每个变量必须明确类型, js是弱类型的语言,定义变量 并不需要明确变量类型

/*
 变量的格式:类型 变量名 = 变量值
*/
class  VariableTest{
   public static void main(String[] args) {
     // 变量的定义
     int myAge = 13;

     // 变量的使用
     System.out.println(myAge);

   }
}

3.3 变量使用的注意事项

  1. Java中每个变量必须先声明,在使用,不同类型的变量具有不同的存储范围
  2. 变量的作用域, 其定义所在的一对{}
  3. 变量只有在其作用域内才有效
  4. 同一作用域内,不能定义重名的变量

关于变量先声明再使用的注意点:

  1. java中变量必须先声明在使用, 否则编译错误
  2. 声明后变量必须先赋初始值, 在使用, 否则编译错误
class  VariableTest{
  public static void main(String[] args) {

    // 1. 变量myNumber声明之前使用
    // 编译错误: 找不到变量myNumber
    // System.out.println(myNumber);

    // int myNumber;

    // 2.变量初始赋值前使用
    // 编译报错:可能尚未初始化变量myNumber
    int myNumber;

    System.out.println(myNumber);

    // 3. 正确使用
    int myNumber;
    myNumber = 40 ;
    // 或者 int myNumber = 40
    System.out.println(myNumber);

  }
}

3.4 var 关键字

有的时候,我们不想明确变量的类型, 则可以使用var 关键字来声明变量,

此时变量的类型将会根据其赋值的数据类型来决定.

示例:

var a = 10;
var b = 3.14;

需要注意的是, 使用var 声明变量, 必须在声明变量时,立即初始化, 不能向之前一样先声明变量在赋值

 // 先声明变量, 在赋值
 int a;
 a = 30;

 // 此时无法确定 变量b的类型
 var b;
 b = 20;</pre>

4. 数据类型

数据类型就是对于每一种数据都定义了明确的具体类型,用于标识在内存中分配不同大小的内存空间存储数据。

4.1 数据类型的分类

基本数据类型(8种):

  1. 整型: byte / short / int / long
  2. 浮点型: float / double
  3. 字符型: char
  4. 布尔型: boolean

引用数据类型

  1. 类: class (注意:字符串使用类, char只是字符型, 只能存一个字符)
  2. 接口: interface
  3. 数组: array
  4. 枚举: enum
  5. 注解 annotation
  6. 记录 record

4.2 整数类型:

java各整数类型有固定的表数范围和字段长度, 以保证java程序的可移植性

java的整型常量默认使用int 类型, 如果声明long 类型,数字后须添加'l'或'L'

java程序中变量通常声明int 类型, 除非不足以 表示较大的数,才使用long 类型

类型占用的存储空间表数范围
byte1字节 = 8bit位-128~127
short2字节-215 ~215 -1
int4字节-231~231 -1
long8字节-263 ~ 263 -1

bit: 计算机中最小的存储单位, byte:计算机中最小的存储单元

class  VariableTest{
   public static void main(String[] args) {
     // 1. 整型: byte (1字节=8bit) \ short (2字节) \ int (4字节) \ long(8字节)
     // 1.1 byte 范围: -128~127
     // byte num = 127; 
     byte num = -128;
     System.out.println(num);

     // 超出表数范围编译不通过
     // num = 128;
     // System.out.println(num);

     // 1.2.  通常定义整型变量时使用int
     short snum = 128;
     System.out.println(snum);

     int inum = 123456;
     System.out.println(inum);

     // 1.3 声明long型变量,必须字数字结尾添加l 或 L
     // 输出是不会显示l 或 L
     long lnum = 445646798797L;
     System.out.println(lnum);
   }
}

开发中,大家定义整型变量时, 没有特殊情况的话, 通常都声明为int类型

4.3 浮点型

与整数类型类似,java浮点类型也有固定的表数范围和长度, 不受具体操作系统的影响

浮点型常量有两种表示形式

  1. 十进制数形式: 如: 5.12 5.1f .58
  2. 科学技术法形式: 如: 5.12e2 512E2 100E-2

Java 支持两种浮点类型的小数

类型占用存储空间表数范围
单精度 float4字节-3.403E38 ~ 3.403E38
双精度 double8字节-1.798E308 ~ 1.798E308

注意: java浮点型常量默认使用double , 因为float不仅精度不高, 而且声明float类型常量时, 常量后必须加'f'或'F'

示例:

class  VariableTest{
   public static void main(String[] args) {
     // 2.浮点型: float(4字节) \ doubl(8字节)
     // 2.1 浮点型, 表示小数数字
     // 2.2 float 表示数值的范围比long还大,但是精度不高
     // 2.3 定义float类型变量时,变量要以f 或 F结尾(否则编译不通过)
     float fnum = 123.3f;
     System.out.println(fnum);

     // 2.4 常用double类型 声明浮点类型变量
     double dnum = 123.456789;
     System.out.println(dnum);
   }
}

在开发过程中, 定义浮点类型,在没有特殊情况下, 通常都声明为double类型.因为精度更高


4.4 字符类型

java采用Unicode编码的一个分支UCS-2, 每个字符采用两个字节(16个二进制位)进行编码

所以在存字符时, 无论是英文字符还是中文字符, 都占用两个字节

char 类型声明的变量只能存一个字符.

字符型变量值有三种表现形式

  1. 使用单引号(’ ')括起来的单个字符, 也是最常使用的,例如: char c1=‘a’
  2. 直接使用Unicode值来表示字符型常量: ‘\uxxxx’, xxxx 表示一个十六进制整数, 例如 \u0061 表示’a’
  3. java中还允许使用转义字符'\' 来将其后的字符转为特殊字符型常量, 例如: char c3=‘\n’ 表示换行符

示例:

class  VariableTest{
  public static void main(String[] args) {
    // 3. 字符类型: char (1字符 = 2字节)
    //  表示方式(即存的值写法方式):
    // 3.1. 声明一个字符(字面量)   
    char c2 = '中'; 
    System.out.println(c2);

     // 2. 转义字符
    char c3 = '\n';   //换行符
    System.out.print(" hello" + c3); 
    System.out.println("world" );

   // 3.直接使用unicode值表示字符型常量(不常用)
    char c4 = '\u0043';   //unicode字符 
    System.out.println(c4);
  }
}

char 类型是可以进行运算的, 因为都是对应的Unicode 码

    char c1 = 'A';
    // 字符类型 c1 参与运算
    int c2 = c1 + 1;
    System.out.println("c2:"+ c2);

4.5 布尔类型

布尔类型只有两个值: true ,false,通常用于逻辑判断,一般使用在流程控制语句

  1. if 条件控制语句
  2. while 循环控制语句
  3. for 循环控制语句
  4. do-while 循环控制语句

示例:

class  VariableTest{
   public static void main(String[] args) {
     // 4. 布尔类型: boolean(true,false)
     // 常用用于逻辑判断
     boolean bb = true;
     System.out.println(bb);  // true

     // 示例(判断是否成年)
     boolean isAdult = true;
     if(isAdult){
       System.out.println("恭喜你成年了!"); 
     }else{
       System.out.println("很遗憾!你没有成年,不能上网."); 
     }
   }
}

真正内存分配,是分配4个字节


5. 基本数据类型转换

5.1 自动类型转换

将一种数据类型的数据赋给另一个类型的变量时, 在满足以下情况下, 将执行自动类型转换

  1. 两种数据类型彼此兼容
  2. 目标类型的取值范围大于原数据类型(低级类型数据转换为高级类型)

示例:

// 将int 类型的常量值赋值给long类型的变量, 会自动类型提升
long l1 = 100;

自动类型转换(自动类型提升)的规则: 容量小的变量与容量大的变量做运算时, 结果自动转为容量大的数据类型

也就是说, 在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据, 转换的规则如下:

  • 数值型数据的转换:byte→short→int→long→float→double

  • 字符型转换为整型:char→int。

示例:

  // 声明不同类型的变量
  byte b1 = 10;
  short s1 = 30;
  int i1 = 40;
  long l1 = 100l;
  float f1 = 3.14f;
  double d1 = 5.8;
  char c1 = 'a';

  // 计算总数
  double total = b1 + s1 + i1 + l1 + f1 + d1 + c1;
  System.out.println("total: " + total);

这种多种类型进行运算, 最后输出容量最大的类型数据, 这种转换一般称为"表达式类型自动提升"


不同类型数据进行运算,需要注意一下几点:

  1. byte与 char, short与char 之间, 不会自动类型转换, 不能直接相互赋值
  2. boolean 类型不能与其他数据类型进行运算
  3. 当把任何基本数据类型的值和字符串(String)进行连接运算时(+)基本数据类型的值将自动转化为字符串(String)类型。

示例:

public class Example {
   public static void main(String[] args){
     // 示例1:
     // long类型的值需要以l,或L结尾, 但不添加l/L结尾也不会错误:
     // 原因在于, 此时123123 值会被理解为int类型, 然后将int类型的值赋值给long
     // 即将容量小的int 类型数据复制给 容量大的long 类型, 会自动类型提升
     long l1 = 123123;

     // 因此如果你的值要超出int数值范围就会报错
     // long l2 = 123456789123456;  // 123456789123456会被理解为int类型, 但超出了int范围,所以报错
     long l3 = 123456789123456L;  // 123456789123456L 被理解为long类型,所以不会报错


     // 示例2:
     // float类型值需要使用f或F结尾, 否则报错
     // flot f1 = 3.14;  // 3.14 会被理解为double类型, 不满足类型提升(float ---double), 所以报错

   }
}

5.2 强制类型转换

自动类型转换只能从容量低的类型变量转容量高的类型变量, 如果需要将容量高的类型赋值给容量低的类型变量, 则会报错

例如: 将3.14 赋值给 int 类型变量

int i = 3.14;   // 编译失败

此时会编译失败, 如果想要赋值成功,只能通过强制类型转行, 将double类型强制转换为int类型才能赋值成功

所以当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。其语法格式如下:

(type)variableName

variableName 值强制换行为type 类型

示例:

int i = (int)3.14;

double类型的3.14 强转为int类型, 结果为3

规则:

  1. 将取值范围大(或容量大)的类型转行为取值范围小(或容量小)的类型,需要使用类型转换
  2. 强制类型转换需要使用强转符: (), 在()内指明要转换为的数据类型.
  3. 强制类型转换可能会导致精度损失
  4. boolean类型不可以转换为其它的数据类型

示例:

public class Example {
   public static void main(String[] args){
     // 练习1:
     long l1 = 12;  // 自动类型提升

     // 编译失败
     // int i1 = l1;

     // 使用强制类型转换
     int i1 = (int)l1;
     System.out.println(i1);  // 12


     // 练习2:
     double d1 =  10;
     short s1 = (short)d1;
     System.out.println(s1);  // 10


     // 练习3
     int i2 = 123;
     float f1 = (float)i2;   // 此时会自动类型提升, 因此强类型转换(float)可以省略
     System.out.println(f1);  // 123.0

     // 练习4
     // 精度损失示例1
     double d2 = 12.9;
     int i3 = (int)d2;
     System.out.println(i3);  // 输出12, 12.9中的.9 损失了

     // 精度损失示例2
     int i4 = 128;
     byte b1 = (byte)i4;
     System.out.println(b1); // -128
   }
}

6. String 字符串类型

6.1 String 类型理解

字符串理解

char 类型不同,字符串类型String 是引用类型,我们用双引号"..." 表示字符串。一个字符串可以存储0个到任意个字符:

String s1 = "";  // 空字符串, 包含0个字符
String s2 = "A";  //  包含1个字符
String s3 = "hello";  // 包含5个字符
String s4 = "你好";   // 包含中文字符

双引号"" 是字符串类型的界定符, 因此在双引号("") 不能包含双引号("")

如果要在"" 包含"" , 必须使用转义字符, 将具有特殊意义的字符" 转为普通字符串\"

String str = "abc\"xyz";
// 字符串中包含7个字符串  a b c " x y z

此时字符串中的" 因为转义符\ 的原因, 将不再具有字符串界定符的意义, 只是表示一个普通字符

String类的理解

  1. String类, 属于引用数据类型, 俗称字符串

  2. String类型的变量,可以使用一对"" 的方式进行赋值

  3. String声明的字符串内容部, 可以包含0个或多个字符


字符串拼接

多个字符串采用+ 进行拼接, 组成一个全新的字符串

String str = "Hello" + " World";

多行字符串

可以使用+拼接多行字符串

String str = "大家好!"
 + "我是一个程序员,"
 + "工作就是打键盘";

使用+ 拼接多行字符串非常不方便, 从Java 13 开始, 可以使用"""...""",表示多行字符串, 即可以在字符串中换行

String str = """
 大家好!
 我是一个程序员
 工作就是打键盘
 """;
System.out.println(str);

需要注意的是, 这种写法最后会有一个换行符, 以及每一行前的空格会被去除.

因此其输出结果为:

大家好!
我是一个程序员
工作就是打键盘
 // 这里有一个空行

字符串不可变性

Java 中的字符串是一个引用类型, 其具有不可变性

不可变性指的是字符串内容不可变

String str = "hello";
str = "world";
System.out.println(str);

这种写法看似修改了字符串, 其实不然, 修改的是变量str的指向

也就是说, 当执行str = world 时, 并不是修改原字符串hello , 而是会在新的内存中创建world 字符串, 并修改变量str 的指针,指向新的字符串, 原来的字符串还在, 只是无法通过变量来访问


空值null

引用类型变量, 声明后未初始化,不可访问, 因此可以让让引用类型变量指向一个空值null, 表示不指向任何对象

String str = null;
System.out.println(str);

注意要区分空值null和空字符串"",空字符串是一个有效的字符串对象,它不等于null。

6.3 基本数据类型和String的运算

String与基本数据类型变量之间的运算

  1. String类型与基本数据类型变量之间只能做连接运算, 使用"+"表示

  2. 运算的结果是String类型

class Example {
 public static void main(String[] args){
 // String类型与基本数据类型拼接
 String str1 = "Hello";
 System.out.println(str1);  // Hello

 int age = 10;
 String str2 = str1 + age ;  // 字符串拼接
 System.out.println(str2);  // Hello10

 boolean b1 = true;
 String str3 = str1 + b1;
 System.out.println(str3);  // Hellotrue

 // 注意特殊情况:
 // 此种写法编译不能通过, 因为按照运算逻辑从左向右的原则
 // 回先计算 int类型 age与boolean 类型 b1相加, 此时运算报错
 // String str4 = age + b1 + str1;

 // 换一种写法
 // 此时编译通过, 因为先运算String类型 变量str1 与 int类型age的拼接, 返回依然是String类型
 // 然后再与boolean类型 b1拼接, 返回依然是String
 String str4 = str1 +  age + b1;
 System.out.println(str4);  // Hello10true
 }
}

标签:类型转换,Java,变量,int,数据类型,System,类型,out,String
From: https://blog.csdn.net/fjiex/article/details/139428521

相关文章