2.Java语法基础

本章目标

  • 数据类型
  • 变量和常量
  • 运算符
  • 数组
  • 循环

本章内容

问题:任何编程语言都离不开数据的计算,那么在编程语言中能过什么来保存变化的计算的值,有哪些类型可以用于计算?这时我们就需要使用到:数据类型、变量、常量、运算符

一、数据类型

java数据类型可分为两大类基本数据类型引用类型),而基本数据类型可细分为4类8种。每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间(例如byte占1个字节)

1、基本数据类型4类

  1. 整数型 byte 、short、int、long
  2. 浮点型 float 、 double
  3. 字符型 char,存放单个字符
  4. 布尔型 boolean,存放true、false

2、引用类型

  • class
  • 接口 interface
  • 数组 [ ]

3、整型

3.1、分类

Java语言的整型数据与C/C++相似,表示没有小数部分的数值,可以为负数。按照存储精度的不同,分为byte、short、int、long四种,分别表示从8位到64位的整数。

与C语言不同的是,Java中数据类型所使用的存储精度与平台无关,例如“int”在任何类型的设备上运行时,其总是表示一个32位的整数。

3.2、Java的整数也可以用以下方式来表示:

  • 十进制
  • 八进制:八进制数以O打头,数字字符为0~7;
  • 十六进制:十六进制数用Ox(OX)打头,数字字符为0~9、a~f或A~F。

3.3、整型所占内存位数和取值范围

默认类型:整数类型是int

数据类型 关键字 内存占用 取值范围
字节型 byte 1个字节 -2727-1(-128127)
短整型 short 2个字节 -215~215-1
整形 int 4个字节 -231~231-1
长整型 long 8个字节 -263~263-1

byte是Java中的一种原始数据类型,用于表示8位有符号整数。在有符号的二进制数中,最高位(最左边的位)用作符号位,当这一位是0时,表示该数是正数;当这一位是1时,表示该数是负数,所以取值是-27,而不是-28次,其它道理一样

在代码中,一个整型数字默认按照int类型处理,如果需要long类型的数,必须在该数后加上字母l (L)。

4、浮点型

默认类型:浮点类型是double

Java的浮点类型分为两种:单精度浮点数和双精度浮点数,分别用关键字float和double来表示。它们的存放位长与机器无关

数据类型 关键字 内存占用 取值范围
单精度浮点型 float 4个字节 1.4013E-45 ~ 3.4028E+38
双精度浮点型 double 8个字节 4.9E-324 至~ 1.7977E+308

在代码中,一个浮点型数字默认按照double类型处理,如果需要float类型的数,必须在该数后加上字母f (F)。

5.布尔型

Java中布尔型变量只有两个值,代表一个逻辑判定:真(true)或假(false)。布尔型数据在机器中位长为8位。

数据类型 关键字 内存占用 取值范围
布尔类型 boolean 1个字节 true,false

布尔型数据的定义举例如下:

  boolean flag = true;

上例定义flag为布尔变量,且初值为true。

6.字符型

Java中字符型变量的类型为char,表示单个字符,字符类型的常量通常包含在一对单引号之间。在内部,它是一个Unicode编码单元。

Java底层默认编码为UNICODE ,从UNICODE开始,无论是半角的英文字母,还是全角的汉字,它们都是统一的”一个字符”!同时,也都是统一的”两个字节”

数据类型 关键字 内存占用 取值范围
字符类型 char 2个字节 0 至~216-1

下面用关键字char定义一个字符变量:

 char a='b'; //定义一个初值为“b”的字符型变量

7、Java中转义字序列

转义字符’’的作用是,和其后面的一个或多个字符一起,表示一个特殊字符,如”“这两个字符来表示一个换行符。

符号 字符含义
换行 (0x0a)
回车 (0x0d)
换页符(0x0c)
退格 (0x08)
\0 空字符 (0x0)
空格 (0x20)
制表符
\" 双引号
\' 单引号
\\ 反斜杠
八进制字符 (ddd)
16进制Unicode字符 (xxxx)

二、变量和常量

程序变量是一个标识符,用于在程序中唯一地识别一个存储区域,这个存储区域可以保存任何类型的数据,如整数、浮点数、字符串等。程序变量在程序执行过程中,其值可以改变,这种变量称为可变变量,而有些变量的值一旦被赋值后就不能改变,这种变量称为不可变变量或常量。

1、变量

变量是程序中的最基本存储单元,它的定义包括变量名、变量类型:

基本定义:是计算机语言中能储存计算结果或能表示值的抽象概念。

  1. 我们在程序中会经常定义一些变量来保存和处理数据。从本质上看,变量代表了一段可操作的内存,也可以认为变量是内存的符号化表示。
  2. 当程序需要使用内存时,可以定义某种类型的变量。此时编译器根据变量类型分配一定大小的内存空间。程序可以通过变量名来访问对应的内存;
  3. 变量的数据类型决定了对应内存的大小
  • 声明变量:

     数据类型 变量名;
    
  • 声明变量的同时初始化:

     数据类型 变量名 = 赋值表达式;
    

Java变量必须先定义,而且经过初始化之后再使用;

2、声明常量

Java中可以使用“final”关键字来声明常量,声明的常量只能被赋值1次,赋值之后就不能再被修改。

 final 数据类型 常量名 = 赋值表达式;

3、标识符与分隔符

3.1、标识符

变量,类和方法都需要一定的名称,将这种名称叫做标识符。Java标识符采用Unicode字符集,可为任意长度。Java中规定,标识符必须以字母、下划线( _ )或美元符( $ )为首字母,后面字符由一个或多个字母、下划线、美元符或数字组成变量声明尽可能靠近第一次使用的位置,便于提高代码的可读性

3.2、分隔符

分隔符用来使编译器确认代码在何处分隔。‘ ’(空格)、‘;’(分号)、‘:’(冒号)等都是Java语言的分隔符。

4、关键字

Java中的语法关键字,又称为保留字:这些名字在Java语法中代表特殊的含义,不能在程序中作为变量、方法的名字出现:

 abstract
 boolean
 break
 byte
 ……

开发工具中颜色特殊,一般都是关键字

三、运算符

1、运算符分类

运算符是表达式的重要组成部分。表达式就是运算符、操作数以及方法调用的序列,用来说明某个计算过程并返回计算结果

在Java中的运算符有以下几种:

  • 算术运算符
  • 位运算符 (不讲)
  • 关系运算符
  • 布尔运算符

2、算术运算符

与C/C++相似,Java算术运算符用于整型或实型数的运算,可分为一元运算符和二元运算符两种。一元运算符如下表所示。

2.1、一元运算符用法表

一元运算符只对一个表达式执行操作,该表达式可以是数值数据类型类别中的任何一种数据类型

运算符 功能描述 用法
+ 正值 +p
- 负值 -p
++ 加1(自增) ++opop++
减1(自减) –op,op–
  例如:
   int i=2;
   int j=3;
   System.out.println(i+++j);
   System.out.println(++j);

注意:

在表达式中应当避免使用++、–的运算,以免造成代码阅读上的歧义++

运算只能使用在整数类型的变量上

2.2、二元运算符用法表

运算符 功能描述 用法
+ op1+op2
- op1-op2
* op1*op2
/ op1/op2
% 求余 op1%op2

“x = x + 3;” 可以简化为 “x += 3;”,同样的形式还有“-=”、“*=”和“/=”;

如果参与“/”运算的两个操作数都是整数,则结果也是整数(整除运算)

3、类型的转换

当运算符两边的操作数类型不一致时,Java会自动将两个操作数转换为同一类型,然后再进行计算。转换规则通常是把精度低的类型转化为精度高的数据类型:

image

在需要的时候,也可以通过代码进行“强制类型转换”(从精度高的类型转为精度较低的类型,这时有可能产生数据精度的损失),例如: int x = (int)45.67;

以下能否正常执行?

byte a = 1;

a = a + 1;

答:不能正常执行,因为1天生int类型,在Java中,编译器+将右边的表达式结果计算出来后,和左边的变量类型比较精度,满足赋值,不满足则报错,而a此时是变量,无法确定值是多少,为了确保数据不超范围,需要强制转换之后才能运行 a = (byte)(a + 1);

扩展:Java中两个byte类型数据相加为什么会报错

思考题:已知数字double d = 3.6,要求通过编程实现四舍五入

int result = (int)(d+0.5)

ASCII码

4、关系运算符

关系运算符用于两个值之间的关系比较,其返回值为布尔类型true/false

运算符 功能描述 用法
== 等于 a==b
!= 不等于 a!=b
> 大于 a>b
< 小于 a<b
>= 大于或者等于 a>=b
<= 小于或者等于 a<=b

注意事项:

1、=是赋值运算符,而真正的判断两个操作数是否相等的运算符是==。

2、==、!=是所有(基本和引用)数据类型都有可以使用。

3、>、>=、<、<=仅针对数值类型(byte、short、int、long、float、double。以及char

5、布尔运算符

又叫逻辑运算符

Java中,逻辑运算符只能对布尔逻辑型数据进行操作,其返回值同样为逻辑型布尔值。其用法如表所示。

关系运算符用于两个值之间的关系比较,其返回值为布尔类型true/false

| 操作数OP1 | 操作数OP2 | && | || | !OP1 |
| --- | --- | --- | --- | --- |
| true | true | true | true | false |
| true | false | false | true | false |
| false | false | false | false | true |
| false | true | false | true | true |

6、条件运算符

条件运算符是一个三元运算符,其一般形式为

 expression ? statement1 :statement2;

其语义为:首先计算表达式expression的值,如果该值为真(true),则将statement1的值作为整个表达式的值,反之,将statement2作为整个表达式的值。如:

max= x >y ? x :y;

该语句取x,y的最大值。需要注意的是,该运算符规定statement1和statement2需返回相同类型的数据,且不能为void。

7、运算符的优先级及结合性(分支)

在 Java 中,每个运算符都有一个优先级,优先级高的运算符会先执行,而优先级低的运算符会后执行。如果有多个运算符在同一个表达式中出现,那么需要按照运算符优先级的规则确定它们的执行顺序

7.1、优先级

下面示例运算结果是多少?

int a = 8, b = 2, c = 5,d = 0;
d = a + b*c;    // 先执行乘法运算,再执行加法运算
d = (a + b) * c; // 先执行加法运算,再执行乘法运算

运算符是有优先级的,它决定表达式中各运算执行的先后顺序。总的来说,运算符优先级具有如下规则:

  • 一元运算符比二元运算符优先级高。
  • 算术运算符比关系运算符优先级高。
  • 关系运算符比按位运算符优先级高。
  • 大于和小于运算符比等于和不等于运算符优先级高。
  • 按位运算符比逻辑运算符优先级高。
  • 逻辑与(&&)比逻辑或(||)优先级高。
  • 赋值运算符优先级最低。
优先级 运算符 结合性
1 ( ) [ ]  . 从左到右
2 !  ~  ++  – 从右到左
3 *  /  % 从左到右
4 +  - 从左到右
5 <<  >>  >>> 从左到右
6 <  <=  >  >=  instanceof 从左到右
7 ==  != 从左到右
8 & 从左到右
9 ^ 从左到右
10
11 && 从左到右
12
13 ? : 从左到右
14 =  +=  -=  *=  /=  %=  &= =  ^=  ~=  <<=  >>=  >>>=
15 从右到左

7.2、结合性

所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算

下面示例运算结果是多少?

int a = 8, b = 2, c = 5;
a = b = c; // 先执行 b = c,再执行 a = b

赋值运算符的优先级相同,但是按照结合性的规则,先执行 b = c,再执行 a = b

7.3、综合案例

下面结果是true还是false

int a=4;
int b=5;
boolean flag = a++<b&&a==b;

四、数组

问题:如果要保存100个整形数据怎么?难道我们要定义一百个变量?那一千个,一万个呢?

1、声明数组

数组是一种数据结构,用于保存相同数据类型的值的集合,在数组中可以通过整数索引来查找每一个元素。可以通过声明数组变量来使用数组,声明时要确定保存的数据类型和数组的长度。语法如下:

元素数据类型[]  数组变量名;
或
元素数据类型  数组变量名[];

例如:

int num[];
float boy[];
char[] cat;

数组名必须是符合Java标识符规定的用户自定义标识符;

类型可以是java中任何一种数据类型包括用户定义的对象类型。

数组变量属于引用类型变量,在变量所表示的内存中只保存指向实际数组的引用(地址)。

2、数组初始化与赋值

声明一个数组变量,只是准备了一个空间用于存放实际数组的地址,并没有真正建立数组,还需要通过初始化或者赋值操作才能使数组变量指向一个可以使用的数组结构。

2.1、先声明再赋值

int[] ages;
ages = new int[5];

创建的过程即是通过“new”运算符为数组结构实际分配内存空间的过程,在上面的语句中,内存空间开辟之后通过“=”赋值运算,将地址保存到数组变量中。数组结构一旦创建,其大小就不能再发生变化。这时数组变量被初始化,可以指向一个实际存在的数组结构;但数组的内容并没有初始化,可以通过为数组元素逐个赋值来进行初始化。

2.1、创建并赋值

对数组内容的初始化可以在“new”运算的同时进行:

 int[] array = new int[]{1,2,3,4….,10};

3、访问数组元素

数组中的元素可以通过一个整数类型的索引(范围从0 ~ (数组长度-1))来访问,通常情况下可以与一个for循环结合来遍历访问数组中的每一个元素:

格式:

数组名[索引]

索引值可以是整数型常量或整数型变量表达式

  例: int i = b2[0];
        b2[5] = 57;
        a[3] = 25;
        a[3+6] = 90;

4、数组引用

在java中,数组有一个length属性,通过“数组名.length”的方式来访问,返回数组的长度

char arraylen[] = new char[10];
int i = arraylen.length;

示例

例:数组的声明、初始化和其长度的测定。
public class ArrayLengthDemo {
    public static void main(String[] args) {
       double[] a1 = new double[8];
       char[] a2 = new char[8];
       char[] a5 = {'A','B','C','D','E','F','H','I'};
       System.out.println("a1.length = " + a1.length);
       System.out.println("a2.length = " + a2.length);
       System.out.println("a5.length = " + a3.length);
      }
    }

5、案例(贯穿项目相关)

输出一组人员名单中所有人员

package com.woniuxy.hrms;

public class TestArray {

    public static void main(String[] args) {
        String[] names = {"张三峰","李四","王麻子","田七","李行礼"};
        System.out.println(names.length);
        System.out.println(names[0]);
        System.out.println(names[1]);
        System.out.println(names[2]);
        System.out.println(names[3]);
        System.out.println(names[4]);

    }

}

五、循环

问题:如果有一百个人员,难道我们要写到names[99]?

1、for循环

类似于学校操场跑圈

1.1、语法

for循环是最常用的循环形式之一,它的一般形式为:

for(<初始化>; <条件表达式>; <增量>)
    循环语句;
  • 初始化:的部分总是一个赋值语句,它用来给循环控制变量赋初值;
  • 条件表达式:是一个关系表达式,它决定什么时候退出循环;
  • 增量:定义循环控制变量每循环一次后按什么方式变化,上述三个部分之间要用“;”分开。循环语句的整体构成了循环体

1.2、for循环的执行过程

image

2、案例(贯穿项目相关)

使用循环输出一组人员名单信息

package com.woniuxy.hrms;

public class TestArray {

    public static void main(String[] args) {
        String[] names = {"张三峰","李四","王麻子","田七","李行礼"};
        System.out.println(names.length);

        for (int i = 0; i < names.length; i++) {
            System.out.println(names[i]);
        }
    }

}

如何实现倒序显示呢?

package com.woniuxy.hrms;

public class TestArray {

    public static void main(String[] args) {
        String[] names = {"张三峰","李四","王麻子","田七","李行礼"};
        System.out.println(names.length);

        for (int i = names.length - 1; i >= 0 ; i--) {
            System.out.println(names[i]);
        }
    }

}

六、扩展

以下内容自行了解即可

在Java编程中,print、println 和 printf 是用于输出文本到控制台的三种不同方法。

1、print 方法

print 方法用于将字符串或其他数据类型的值输出到控制台,单纯输出无换行符。

输入:

System.out.print("Hello");
System.out.print("World");

输出: HelloWorld

2、println 方法

println 方法用于将字符串或其他数据类型的值输出到控制台,并在输出后自动添加一个换行符。

输入:

System.out.println("Hello");
System.out.println("World");

输出: Hello World

3、printf 方法

printf 方法用于格式化输出,它允许你使用格式化字符串和格式说明符来输出文本。printf 不会在输出后自动添加换行符,除非格式字符串中明确包含 或其他换行符。printf 方法在格式化输出方面非常灵活和强大,在实际开发中能极大地提高代码的可读性和输出的美观度。

3.1、基本语法:

printf(String format, Object… args);

format:格式字符串,包含文本和一个或多个格式说明符。

args:要格式化的参数列表,与格式说明符对应。

格式说明符 说明 %d 整数(十进制) %x 整数(十六进制) %o 整数(八进制) %f 浮点数 可以使用 .precision 指定小数点后的位数。 %e:科学计数法表示的浮点数。 %g:根据值的大小自动选择 %f 或 %e。 %s 字符串 %c 字符 %b 布尔值 %% 输出一个百分号

3.2、使用 printf 的注意事项:

  • *参数顺序:**格式说明符的顺序必须与参数列表中的参数顺序一致。(printf(“Name: %s, Age: %d, Salary: %.2f%n”, name, age, salary); )
  • *类型匹配:**参数的类型必须与格式说明符匹配,否则会抛出异常。int age %d

换行符:%n 是平台独立的换行符,推荐使用它而不是 。

输入:

  // 定义变量:
   String name = "Alice";
   int age = 30;
   double salary = 12345.6789;
   // 简单输出
    System.out.printf("Name: %s, Age: %d, Salary: %.2f%n", name, age, salary);

    // 对齐输出
    System.out.printf("|%10s|%10d|%10.2f|%n", name, age, salary);
    System.out.printf("|%-10s|%-10d|%-10.2f|%n", "Bob", 25, 9876.5432);

    // 十六进制和八进制
    System.out.printf("Hexadecimal: %x, Octal: %o%n", 255, 255);

输出: Name: Alice, Age: 30, Salary: 12345.68 | Alice| 30| 12345.68| |Bob |25 |9876.54 | Hexadecimal: ff, Octal: 377

posted @   icui4cu  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示