Java SE(一)- 基础语法

时间:2022-06-14 21:03:15

一、Java数据基本概念

Java的基本概念,包括标识符、关键字、数据类型、字面值、变量和常量等。

1、代码规范与注释

尽量使每个变量的声明单独占一行;关键字与关键字间只认一个空格;不要使用技术性很高、难懂、易混淆的语句;对于关键的方法要多加注释。

代码中使用英文半角符号。

 1 //这里是单行注释
 2 
 3 /*
 4 这里是多行注释
 5 */
 6 
 7 /**
 8 *这里是多行的文档注释(可导出doc帮助文档)
 9 *
10 */

2、基本数据类型

2.1整数型

四种声明 内存空间 取值范围
byte 1字节 -128~127
short 2字节 -32768~32767
int 4字节 -2147483648~2147483647
long 8字节 -9223372036854775808~9223372036854775807

注:

(1)1字节=8位,以byte为例,256=2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0     对应正负范围区间-128~127

(2)long整型赋值时,整数后面要加上l或者L。否则可能造成精度丢失,因为java的默认整数类型是int。

(3)8进制,以0开头:                     int a = 033;即十进制下的27

         16进制,以0x或0X开头:         int a = 0x33;即十进制下的51

2.2浮点型

两种声明 内存空间 取值范围
float 4字节 1.4E-45~3.4028235E38
doudle 8字节 4.9E-324~1.7976931348623157E308

注:

(1)float赋值时,数值后面要加上f或F。

(2)doudle赋值时,数值后面可以加上d或D,也可不加,因为java中浮点型的默认类型是double。

(3)java中近似值不精确,使用Math.round( ),四舍五入法。

 1 public class Demo{
 2       public static void main(String[] args){
 3              double a = 4.35 * 100;
 4              System.out.println(a);
 5              System.out.println(Math.round(a));
 6            }
 7 }
 8 
 9 
10 输出结果:
11 434.99999999999994
12 435

(4)java中近似值不精确,使用Math.abs( )<1e-6 ,最小值对比法。

 1 public class Demo{
 2       public static void main(String[] args){
 3              double a = 0.1;
 4              double b = 2.0 - 1.9;
 5              System.out.println(a);
 6              System.out.println(b);
 7              System.out.println(a==b);
 8              System.out.println(Math.abs(a-b)<1e-6);
 9            }
10 }
11  
12  
13 输出结果:
14 0.1
15 0.10000000000000000000009
16 false
17 true

2.3字符型

用单引号包含的可打印的单个符号。

字符'8'(以字符编码参与运算)与数字8,字面值相同但是值是不同的。

类型 取值范围(采用unicode编码)
char 0~65536

char可以保存字符,也可以保存对应的字符编码值。

上下赋值结果相同 char a = 'a' char b = '汉' char c = '2'
char a = 97 char b = 27721 char c = 50

问题:如何给char赋值单引号?' ' '三个单引号是错误的,因此引入转义字符,代表特殊的字符。

转义字符 含义
\' 单引号字符
\" 双引号字符
\\ 反斜杠字符
\t 垂直制表符,将光标移到下一个制表符位置
\r 回车
\n 换行
\b 退格
\f 换页

\101表示八进制值101,即字符编码值65对应的字符A。

2.4布尔型

关键字boolean定义变量, true或false,逻辑上的真假。

1 boolean a;
2 boolean a = true;
3 boolean a = true, b = false;

3.数据类型转换

原则:“勿以小杯盛大物”,不同的数据类型占用的内存空间不同,低精度可以放入高精度,高精度放入低精度则可能精度丢失。

  转换方式
低精度→高精度 隐式转换(自动转换)、显式转换(强制转换)         
高精度→低精度 显式转换(强制转换)

3.1隐式转换

低精度精度可以直接赋值给高精度类型。
自动转换的兼容顺序:byte → short → int(char) → long → float → double
注:char和int精度不同,但是在char的取值范围内两者兼容。

3.2显式转换

可能导致精度丢失。
语法:    (类型名)要转换的值            注:强制转换同样适用于引用类型,如类、接口等(后续章节介绍)
  1: int a = 100;
  2: byte b = (byte)a;

显式转换导致精度损失举例:

  结果 精度损失分析
float f=(float)3.1415926 3.1415925(默认double强制转float) 数据失准
int i=(int)f; 3 小数点丢失
byte b=(byte)129 -127 数值越界溢出

4.常量与变量

标识符:用来标识类名、变量名、方法名、数组名等等的有效字符序列。

标识符命名规则:由任意顺序的字母_$数字组成,第一个字符不能是数字,不能是Java中的保留关键字,严格区分字母大小写。

注:标识符使用汉字,字符编码集发生改变后,代码中的中文标准符全部显示乱码。

标识符的命名规范:

类名 方法名 变量名 常量名
通常使用名词,所有单词首字母大写。 通常使用动词,首单词字母小写,后续单词首字母大写。 首单词字母小写,后续单词首字母大写。 所有字母均大写。
PandaFamily openDoor() sisterName GENDER(性别)

关键字:Java语言中被赋予特定意义的单词。以下就是Java中所有的关键字。

Java SE(一)- 基础语法

为什么需要变量?

内存地址直接使用十分繁琐,变量名对应着数据存储的内存地址,通过变量名就可以找到数据存储的位置,变量名直接调用为存储的数值。

语法:     数据类型 变量名 = 变量值;           //变量的值是可以改变的

为什么需要常量?

实际开发中,有些值是不需要更改的,甚至不允许更改。将不会改变的量称为常量。

语法:     final 数据类型 常量名 = 常量值;    //final是声明常量的关键字

二、Java运算符

算术、赋值、逻辑和条件等常用运算符,以及简单的条件结构if和if-else。

1、赋值运算符(二元)

  1: 量 = 值  
  2: //量:做写的操作,被赋予等号右侧的值
  3: //值:做读取操作,可以是常量、公式

2、算术运算符(二元)

运算符 说明 实例 结果
+ 12.45f+15 27.45
- 4.56-0.16 4.4
* 5L*12.45f 62.25
/ 7/2 3
% 取余 12%10 2

注:(1) + 运算符还有作用:拼接字符串               如:”hello”+”world”

      (2)使用除法运算符与取余运算符,0不能做除数。

3、自增自减运算符(单目运算符)

运算对象:整数或浮点数

  自加运算符 自减运算符 区别
前置形式 ++a --a 先自增自减,再赋值
后置形式 a++ a-- 先赋值,再自增自减
计算结果 a+1 a-1  

单目运算符不可以放在圆括号之外。

  1: (a + b)++      //错
  2: --(x + y)      //错

4、比较运算符(关系运算符)

关系运算符的结果是布尔值。

Java SE(一)- 基础语法

注:    a<b<c      //错误

5、逻辑运算符(二元)

运算对象:布尔型数据。         逻辑运算符的运算结果是布尔值。

Java SE(一)- 基础语法

6、位运算符

位运算符分为:(1)位逻辑运算符(2)位移运算符Java SE(一)- 基础语法

 

6.1位逻辑运算符

以下是位逻辑运算符真值表(位逻辑运算结果)

                                                                   与                     或                     异或                   取反

Java SE(一)- 基础语法

异或:A和B不相等则返回1,相等则返回0。

位逻辑运算过程(位逻辑运算结果):

Java SE(一)- 基础语法

 

 Java SE(一)- 基础语法

注:位取反运算涉及到符号数的三种表示法:原码、反码、补码。(将单独一篇日志说明)

位逻辑运算的逻辑结果:

Java SE(一)- 基础语法

6.2位移运算符

左移<<(二进制码整体左移),示例:

Java SE(一)- 基础语法

注:符号位(首位0正1负)不发生改变的情况下,左移一位即原来的数字乘二。

右移>>(二进制码整体右移),示例:

Java SE(一)- 基础语法

注:正数右移符号不会发生改变(左侧补0);负数右移符号也不会发生改变(此时左侧自动补1)。

无符号右移>>>(二进制码整体右移,此时不分操作数是否为正负数,高位一律补0),示例:

Java SE(一)- 基础语法

注:byte和short为低精度整型,不适合做无符号右移(高位补0不会发生,即一直为负数)待定

7、三元运算符

三元运算符的功能与if…else相似。

  1: //语法   返回值=判断公式?结果1:结果2;
  2: //判断公式:一个返回布尔值的公式
  3: //结果1:如果公式返回的是true,运算符结算返回结果1
  4: //结果2:如果公式返回的是false,运算符结算返回结果2
  5: int a = 1;
  6: int b = a<3?2:3;    //显然1小于3,则b=3

注:返回值不可忽略。(int b = a<3?2:3;正确)(a<3?2:3;错误a<3?2:3;可以整体做参数输出)

8、运算符优先级

运算符的优先级列表:

Java SE(一)- 基础语法

注:(1)从操作数个数来看,单目运算符的优先级高于双目运算符的优先级;

     (2)按照运算符的作用来看,()级别最高,之后依次是算术运算符、位运算符、关系运算符、逻辑运算符、赋值运算符。

三、Java流程控制(选择)

进一步学习选择结构,包括多重if与嵌套if结构 ,以及switch结构。

1、if条件语句

1.1第一种形式

  1: if(布尔表达式){
  2:     语句;
  3: }
  4: //(布尔表达式)为true则执行{}中的语句;为false则跳过{}中的语句。
  5: 
  6: 
  7: 
  8: if(布尔表达式)
  9:      语句;
 10: //(布尔表达式)为true则执行第一个";"前的语句;为false则跳过第一个";"前的语句。

注:严格遵守if格式,if(布尔表达式);错误,后续语句不受if控制

1.2第二种形式

  1: if(布尔表达式){
  2:     语句1;
  3: }else{
  4:     语句2;
  5: }
  6: //(布尔表达式)为true执行语句1所在的{}中的所有语句;
  7: //为false执行语句2所在的{}中的所有语句。

注:出现多个if情况下(非嵌套),else会匹配一个距离最近的未匹配的if语句。

1.3第三种形式

  1: if(表达式1){
  2:    语句1;
  3: }else if(表达式2){
  4:    语句2;
  5: ...
  6: }else if(表达式n){
  7:    语句n;
  8: }else{
  9:    语句m;
 10: ]
 11: 
 12: //多分支表达语句

if判断语句的总结:

(1)表达式:关系表达式或者逻辑表达式。

(2)表达式的运算结果应该是

真:执行该语句;假:跳过该语句,执行下一条语句。

(3)“语句”可以是单条语句也可以是复合语句

(4)else if可以有很多条,无上限。

(5)if和else if都需要判断表达式真假,else不需要,else if和else必须配合if一起使用,不能单独使用。

2、switch多分支语句

  1: switch(用于判断的参数){            //整数、枚举、字符串
  2: case 常量表达式1:语句1;break;     //break用于跳出switch语句,可以不写。
  3: case 常量表达式2:语句2;break;
  4: ...
  5: case 常量表达式n:语句n;break;
  6: default:语句n+1;break;             //所有case无匹配,则执行该条语句。
  7: }

注:(1)若某一case后的语句为空(无;),但是case匹配,则执行下一条非空的case语句(不一定匹配)。

(2)字符串作switch的参数(JDK1.7的新特性,仅支持1.7及以上的版本)

Java SE(一)- 基础语法

四、Java流程控制(循环)

掌握while循环、do-while循环、for循环和循环嵌套的使用。

Alt+/             自动补全

Ctrl+shift+F   自动调整格式

Ctrl+S           保存

1、while循环语句

语法格式:

  1: while(布尔表达式){         //返回布尔值,判断是否执行语句
  2:      语句;                 //可被循环执行的语句
  3: }

1到100相加,举例:

  1: 
  2: public class Demo {
  3: 	public static void main(String[] args) {
  4: 		int sum = 0;
  5: 		int i=1;
  6: 		while(i<=100) {
  7: 			sum=sum+i;
  8: 			i++;
  9: 		}
 10: 		System.out.println("1到100相加的结果是:"+sum);
 11: 	}
 12: }
 13: 
 14: 
 15: 输出:
 16: 1到100相加的结果是:5050

注:(1)表达式不允许为空;

(2)表达式不应该是常数;

  1: while(true){       //无线循环
  2: ...
  3: }
  4: 
  5: 
  6: while(false){      //永不循环
  7: ...
  8: }

(3)循环体中要有改变条件表达式值的语句,否则将成为死循环。

  1: int i=1;
  2: while(i<=2)
  3: {
  4:    System.out.println(i);   //死循环
  5: }

2、do…while循环语句

语法格式:

  1: do{
  2:    语句;
  3: }while(布尔表达式);
  4: 
  5: //相比较于while,do...while先执行循环语句,再判断。

密码输入示例:

  1: import java.util.Scanner;
  2: 
  3: public class Demo {
  4: 	public static void main(String[] args) {
  5: 		Scanner sc=new Scanner(System.in);
  6: 		String pwd1="0";
  7: 		String pwd2="-1";
  8: 		do {
  9: 			System.out.println("请输入密码:");
 10: 			pwd1=sc.nextLine();
 11: 			System.out.println("请再次输入密码:");
 12: 			pwd2=sc.nextLine();
 13: 			if(!pwd1.equals(pwd2))
 14: 				System.out.println("您输入的密码不一致,请重新输入!");
 15: 		}while(!pwd1.equals(pwd2));
 16: 		System.out.println("设置密码成功!");
 17: 	}
 18: }
 19: 

注:(1)表达式不允许为空(同while);

(2)表达式不应该是常数(同while);

(3)循环体中要有改变条件表达式值的语句,否则将成为死循环(同while);

(4)不要少写结尾的分号。

  1: do{
  2: ...
  3: }while(...)

;

     //少分号,程序会报错

3、for循环语句

3.1for语句

语法格式:

  1: for(初始化表达式1;布尔表达式2;表达式3){
  2:     语句;
  3: }
  4: //初始化表达式1:循环开始前运行一次,可做赋值操作。
  5: //布尔表达式2:返回布尔值,控制循环是否继续执行。
  6: //表达式3:通常是赋值表达式,在完成一次循环之后执行。

计算从1加到100的和,示例:

  1: public class Demo {
  2: 	public static void main(String[] args) {
  3: 		int sum=0;
  4: 		for(int i=1;i<=100;i++) {
  5: 			sum +=i;
  6: 		}
  7: 		System.out.println("sum="+sum);
  8: 	}
  9: }
 10: 

注:多层for循环嵌套,配合嵌套if,可以解线性最优解问题(问题:100元买鸡,公鸡5元一只,母鸡3元一只,小鸡3只1元,如何在用完100元的情况下分配买鸡情况)。

3.2foreach语句

foreach相当于for的特殊简化版本。

语法格式:

  1: for(type x:obj){
  2:    引用了x的java语句;
  3: }
  4: 
  5: //type x:循环变量,依次将obj中的值赋给x
  6: //obj:一个可以被遍历的集合,例如数组
  7: 
  8: //**遍历**//
  9: //简单的理解为:对数组或者集合中的所有元素,逐一访问,依次读取一遍。
 10: 
 11: //**数组**//
 12: //相同数据类型的元素按一定顺序排列的集合。

示例:

  1: public class Demo {
  2: 	public static void main(String[] args) {
  3: 		int arr[]={5,8,9};
  4: 		for(int x:arr){
  5: 		   System.out.println(x);
  6: 		}
  7: }
  8: }
  9: 
 10: 输出结果:
 11: 5
 12: 8
 13: 9

4、循环控制

4.1关键字break

break作用:中断循环

break适用的语句:

Java SE(一)- 基础语法

break控制内层循环和外层循环:

Java SE(一)- 基础语法

注:单单的break只能中断内层循环,通过使用标签(变量Loop可自定义)可以直接中断标记位置的外层循环。

4.2关键字continue

continue的作用:直接跳转执行下一次循环

Java SE(一)- 基础语法

注:continue也可以只用标签,跳转至外层执行下一次循环。

五、Java数组

介绍维数组的定义和使用,以及增强型for循环的应用,并能够实现冒泡排序。

1、一维数组

语法格式:

  1: 数组元素类型  数组名[];
  2: 数组元素类型[]  数组名;     //创建一维数组两者一样,只创建了数组没有定义数组长度
  3: 
  4: 
  5: //数组初始化三种方法,初始化就是给数组赋初值。
  6: //(1)
  7: int a[] = new int[3];         //指定数组长度
  8: a[0] = 7;                     //赋初值
  9: a[1] = 8;
 10: a[2] = 9;
 11: 
 12: //(2)
 13: int b[] = new int[]{4,5,6};   //根据集合元素的个数自动指定数组长度
 14: 
 15: //(3)
 16: int c[] = {1,2,3};            //相当于方法(2)的简化版

注:(1)常见一维数组类型:整型数组、浮点型数组、字符数组、字符串数组。

(2)int arr[] = new int[3]{4,5,6};      //语法错误

(3)java数组沿用C语言风格,数组下标从0开始。若a[]长度为3,a[3]属于下标越界。

数组的length属性:(返回数组长度)

  1: //数组名.length   返回的是数组长度值
  2: public class Demo {
  3: 	public static void main(String[] args) {
  4: 		
  5: 		int a1[] = new int[15];
  6: 		   System.out.println(a1.length);
  7: 		
  8: }
  9: }
 10: 
 11: //输出
 12: //15

注:(1)length返回的是int型;

(2)数组长度不可以定义成负数;

(3)length的值是常量。

示例:

  1: //打印每个月的天数
  2: public class Demo {
  3: 	public static void main(String[] args) {
  4: 		int day[] = {31,28,31,30,31,30,31,31,30,31,30,31};
  5: 		for(int i=0;i<day.length;i++) {
  6: 		   System.out.println((i+1)+"月有"+day[i]+"");
  7: 		}
  8: 		
  9:     }
 10: }

2、二维数组

语法格式:

  1: 数组元素类型  数组名[][];
  2: 数组元素类型[][]  数组名;     //创建二维数组两者一样,只创建了数组没有指定行数列数
  3: 
  4: //二维数组初始化的三种方法
  5: //(1)
  6: int tdarr1[][] = {{1,3,5},{5,9,10}};               //方法(2)的简化版
  7: 
  8: //(2)
  9: int tdarr2[][] = new int[][]{{1,3,5},{5,9,10}};    //第一个大括号即第一行tdarr[0],后同理
 10:                                                    //自动指定2行3列
 11: 
 12: //(3)
 13: int tdarr3[][] = new int[2][3];                    //创建二维数值,指定行数列数
 14: tdarr3[0] = new int[]{1,3,5};                      //一次性初始化第一行tdarr[0]
 15: tdarr3[1][0] = 5;                                  //对第二行初始化
 16: tdarr3[1][1] = 9;
 17: tdarr3[1][2] = 10;                                 //相当于tdarr[1] = new int[]{5,9,10};

二维数组下标对应的位置关系:

Java SE(一)- 基础语法

示例:(用二维数组将《春晓》以横版和竖版输出?)

Java SE(一)- 基础语法

横版:

Java SE(一)- 基础语法

竖版:

Java SE(一)- 基础语法

注:(1)arr.length返回行数,arr[i].length返回当前i行的元素个数,即列数。

(2)System.out.print();       //输出不换行

3、数组的基本操作

3.1遍历数组

遍历数组就是获取数组中的每个元素。

遍历二维数组方法:(1)双for循环(2)双foreach循环

示例:(双for)

Java SE(一)- 基础语法

(双foreach)

Java SE(一)- 基础语法

3.2填充替换数组元素

 

3.3对数组排序

 

3.4复制数组

 

3.5数组查询

 

4、排序算法(将单独一篇日志说明)

 

六、Java方法

方法的定义和调用,数组作为方法参数、方法重载、传值和可变参数列表等概念和应用。

 

 

 

 

补充:

包声明:一个java应用程序是由若干个类组成,语句package Number为声明该类所在的包,package为包的关键字。

声明成员变量和局部变量:将类的属性称为类的全局变量(成员变量),将方法中的属性称为局部变量。全局变量声明在类体中,局部变量声明在方法体中。

编写主方法:main()方法是类体中的主方法,从 { 开始至 } 结束。Java程序中的main()方法必须声明为public static void,public是权限修饰符,static是静态修饰符,void是返回值修饰符。String[] args是一个字符串类型的数组,它是main()方法的参数。main()方法是程序开始执行的位置。

导入API类库:在Java语言中可以通过import关键字导入相关的类。