2.1 标识符与关键字

2.11 标识符

什么是标识符?

用来标识 类名,变量名,方法名,类型名,数组名以及文件名的有效字符序列称为标识符。

简而言之 标识符就是一个名字

Java中标识符有以下限制

  1. 标识符由数字,字母,下划线,美元符号组成,长度不受限制
  2. 标识符第一个字符不能是数字
  3. 标识符不能是关键字
  4. 标识符不能是ture false null(尽管 true false null 不是Java关键字)

合法的标识符

  1. HappyNewYear_ava
  2. TigerYear_2010
  3. $98apple
  4. GWY_IS_PIG
  5. hello
  6. Hello

需要注意的是:标识符中字母是区分大小写的,hello和Hello是不同的标识符.

2.12 unicode字符集

Java使用unicode标注字符集,该字符集是由 UNICODE协会管理的并接受技术上的修改,可以最多识别65536个字符….

简而言之:Java支持多语言

2.13 关键字

关键字是一些具有特殊意义的单词,不可以把关键字作为标识符使用

Java中共有50个关键字

abstract assert boolean break byte
case catch char class const
continue default do double else
enum extends final finally float
for goto if implements import
instanceof int interface long native
new package private protected public
return strictfp short static super
switch synchronized this throw throws
transient try void volatile while

2.2 基本数据类型

基本数据类型也称 简单数据类型,Java中共有8种基本数据类型,分别是 boolean byte short char int long float double

习惯上分为一下四大类型

  • 逻辑类型
    • boolean
  • 整数类型
    • byte
    • short
    • int
    • long
  • 字符类型
    • char
  • 浮点类型
    • float
    • double

2.2.1 逻辑类型

取值 ture false

非真既假,非假既真

使用 boolean 关键字来声明变量,声明时也可以给变量赋初始值

  1. boolean male = true;
  2. boolean isLight;
  3. isLight = false;

2.2.2 整数类型

整型数据分为四种

int 4字节

使用关键字 int来声明变量,也可以在声明时赋值

常量 123(十进制) 0b0110(二进制) 077(八进制) 0xFFFF(十六进制)

2. 基本数据类型与数组 - 图1

  1. int x = 100;
  2. int b = 077;
  3. int c = 0xFF;
  4. int d = 0b0110;

byte 1字节

使用关键字 byte来声明变量,也可以在声明时赋值,

Java中不存在byte类型常量表示方法,但是可以把一定范围内的int型常量赋值给byte

2. 基本数据类型与数组 - 图2

  1. byte x=127;

short 2字节

使用关键字 short来声明变量,也可以在声明时赋值

2. 基本数据类型与数组 - 图3

  1. short x = 12;

long 8字节

使用关键字 long来声明变量,也可以在声明时赋值,常量后缀用 L表示

2. 基本数据类型与数组 - 图4

  1. long width =12,height =2005L;

2.2.3 字符类型 2字节

常量 A a ? ! 等,即使用 单引号括起来的 unicode表中的字符。

使用 关键字 char来表示字符型变量

2. 基本数据类型与数组 - 图5

  1. char ch = 'A';
  2. char home ='家';
  3. char $ = 'の';

Java中 int byte short long没有 unsigned类型,因此 unsigned int x = 10; 这种写法是错误的。

但是 Java中 char 一定是 无符号的,不允许使用 unsigned来修饰char 变量

2.2.4 浮点类型

浮点类型分为两种,单精度浮点型 float和双精度浮点型 double

单精度浮点型

使用关键字 float 来表示单精度浮点型变量.需要注意的是单精度浮点型变量值后缀是以 F结尾的

float类型保留小数点后8位.

  1. flaot PI = 3.14F;

2. 基本数据类型与数组 - 图6

双精度浮点型

使用关键字 double 来表示双精度浮点型变量,和float不同的是,不需要加 F后缀.

double类型保留小数点后16位

  1. double PI = 3.14_15926_53589;

当值数字过长时,我们可用 _分割来提高可读性。

2. 基本数据类型与数组 - 图7

2.3 类型转换运算

当把一种基本数据类型,变量赋值给另一种基本数据类型变量,是涉及到 数据转换

数据类型精度从低到高

2. 基本数据类型与数组 - 图8

当我们发生数据类型转换时,无非两种情况.

  1. 待转数据类型占用字节>目标数据类型
  2. 待转数据类型占用字节<目标数据类型

假设场景:我们要把一杯水从一个容器中,倒到另一个容器中(忽略物理条件,比如说杯壁残留)我们这里就是理想状态。

那么情况一: 从一个大容器中将水倒入一个小容器中。会发生什么?目标容器太小了,导致了 溢出,如果我们继续倒水,那么就会有一部分水洒落,被 丢失了

再来看情况二:从一个小容器中将水倒入一个大容器中,显然这个可以倒下,并且不会溢出。

回到我们现实中,这里的 溢出,用专业术来讲叫做 精度丢失

在Java中

  • 低精度数据类型 -> 高精度数据类型自动转Java会自动帮助我们完成转换
  1. // int -> float
  2. float x = 100;
  • 高精度数据类型-> 低精度数据类型强制转 需要我们手动强制转换,会导致精度丢失.
  1. // 强制类型转换语法
  2. // 目标类型 变量名 = (目标类型) 源类型;
  3. int x = (int)3.14;
  4. long y =(long)56.98F;
  5. int z =(int)1999L;

2.4 输入输出数据

2.4.1 输入基本型数据

Scanner在Java中用来处理用户键盘输入的数据.

  1. Scanner reader = new Scanner(System.in);

这里是Java创建对象的语句

  • Scanner reader 数据类型 变量名
  • new Scanner() 调用Scanner 的构造方法new关键字用来创建一个对象
  • System.inJava输入流对象

经过上述语句后,reader 就可以正式使用了

这里我们把 reader 叫做 实例化对象

调用下列方法,便可以读取用户在命令行输入的数据.

  1. nextBoolean();
  2. nextByte();
  3. nextShort();
  4. nextInt();
  5. nextLong();
  6. nextFloat();
  7. nextDouble();

上述方法调用时会阻塞,程序等待用户输入完毕后继续执行.

  1. import java.util.Scanner;
  2. public class HelloWorld {
  3. public static void main(String[] args) {
  4. Scanner reader = new Scanner(System.in);
  5. System.out.println("你叫什么名字鸭?");
  6. String name = reader.nextLine();
  7. System.out.println("你好,"+name);
  8. }
  9. }
  1. 你叫什么名字鸭?
  2. Jack
  3. 你好,Jack

我们调用方法需要使用 实例对象名.方法名()这样才能正确调用。

2.4.2 输出基本类型

在Java中使用,System.out.println() 或者 System.out.println() 可输出 串值 或者 表达式值。并允许使用 +将变量,表达式,或者一个常数值,字符,一起输出。

既然都是输出为什么还要有这两个语句呢?

  • System.out.print()打印不换行
  • System.out.println()打印后换行

这里的: println = print + line

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. System.out.println("我叫," + "Fangf");
  4. System.out.println("我今年" + 22 + "岁了");
  5. System.out.println("我怎么还没" + "女朋友"+'!');
  6. }
  7. }
  1. 我叫,Fangf
  2. 我今年22岁了
  3. 我怎么还没女朋友!

相信有学过C语言的读者们一定了解 printf 这个函数,他的作用是格式化打印输出.

Java中同样可以使用 System.out.printf()

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. System.out.printf("我叫%s,我今年%d岁了,我怎么还没女朋友%c","Fangf",22,'!');
  4. }
  5. }
  1. 我叫Fangf,我今年22岁了,我怎么还没女朋友!

这里的格式化控制符和C语言一模一样,不做详细概述.

  • %d 输出int 型数据
  • %c 输出char型数据
  • %f 输出浮点型数据 ,小数部分最多保留6位
    • %.2f 保留两位小数
  • %s 输出字符串数据
  • %10s 右对齐10列
  • %-5s 左对齐5列

2.5 数组

在前面我们学习了,int char doule 等基本数据类型,现在有个问题如果我们要存取若干个连续类型相同的变量,我们应当如何做呢?

  1. int x1,x2,x3,x4,x5;

这样?如果我要100w个数据,难道你写100w个变量吗?

所以上述方案是不可取的,我们需要引入数组的概念。

数组:一些类型相同元素组成的集合,在内存上是连续的。

数组是引用类型变量,不能像基本数据类型那样直接使用

2.5.1 声明数组

创建数组需要两个步骤

  • 声明数组
  • 分配元素

Java中声明数组有两种方式

  1. 元素类型 数组名[];
  2. 元素类型 [] 数组名称 // 推荐

这里推荐第二种方式,别问为什么,问就是好用!

有学过 C/C++的读者肯定要问了? 为什么不在 []内写数组个数?

Java不允许在声明数组的方括号中,指定数组元素个数,否者将会导致语法错误.

2.5.2 为数组分配元素

声明数组仅仅是,给出了数组变量的名字和数据类型,想要真正使用数组还要给数组分配元素

  1. 数组名 = new 数组元素类型[元素个数];

例如

  1. String [] girlFirends;
  2. girlFriends = new String[3];

给数组指定元素

  1. // 数组名[下标索引]=值
  2. girlFriends[0]="null";
  3. girlFriends[1]="none";
  4. girlFriends[2]="nil";

声明数组和创建数组可以一起完成

  1. float [] score = new int[5];

二维数组和一维数组一样,也需要在使用前进行初始化

  1. int [][] points = new int[3][3];

和C语言不同的是Java允许使用int类型指定元素个数

  1. int size = 5;
  2. int [] arr = new int[size];

2.5.3 数组元素的使用

一维数组通过 索引访问自己的元素,需要注意的是索引下标从 0开始,如果数组有个N个元素,那么索引最大可取值为 N-1

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. String[] season = new String[4];
  4. season[0] = "spring";
  5. season[1] = "summer";
  6. season[2] = "autumn";
  7. season[3] = "winter";
  8. // 访问数组元素
  9. System.out.println(season[1]);
  10. }
  11. }
  1. summer

如果数组下标超出范围,则会抛出 ArrayIndexOutOfBoundsException异常

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. String[] season = new String[4];
  4. season[0] = "spring";
  5. season[1] = "summer";
  6. season[2] = "autumn";
  7. season[3] = "winter";
  8. // 访问数组元素
  9. System.out.println(season[1]);
  10. // 下标越界
  11. System.out.println(season[4]);
  12. }
  13. }
  1. summer
  2. Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
  3. at base.HelloWorld.main(HelloWorld.java:15)

2.5.4 length 的使用

数组名.length 可以查看数组长度

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. String[] season = new String[4];
  4. season[0] = "spring";
  5. season[1] = "summer";
  6. season[2] = "autumn";
  7. season[3] = "winter";
  8. // 查看数组长度
  9. System.out.println("size:"+season.length);
  10. // 二维数组
  11. int[][] ints = new int[3][5];
  12. System.out.println("ints size:"+ints.length);
  13. }
  14. }
  1. size:4
  2. ints size:3

2.5.5 数组的初始化

创建数组后,系统会默认给数组元素一个初始值,我们在声明数组时,也可以给数组初始值.

  1. double[] score = new double[]{98.0, 95.0, 93.0, 92.5};

相当于

  1. double[] score;
  2. score = new double[]{98.0, 95.0, 93.0, 92.5};

2.5.6 数组的引用

  1. public class HelloWorld {
  2. public static void main(String[] args) {
  3. double[] score;
  4. score = new double[]{98.0, 95.0, 93.0, 92.5};
  5. // score 的引用
  6. double[] temp = score;
  7. System.out.println(score);
  8. System.out.println(temp);
  9. System.out.println(temp.length);
  10. char city[] = new char[]{'山', '西', '省', '临', '汾', '市'};
  11. System.out.println(city);
  12. }
  13. }
  1. [D@60e53b93
  2. [D@60e53b93
  3. 4
  4. 山西省临汾市

如果输出是 char[] 数据 则不会输出引用,而是输出数组的全部元素

本质上就是两个指针指向了同一块内存区域(需要注意的是Java中并没有指针的概念)

2.5.7 小结

  • 标识符由数字,字母,下划线,美元符号组成,并且第一个字符不能是数字.
  • Java中有8种基本数据类型boolean byte short int long float double char
  • 数组是想同类型的数据元素按顺序组成的一种复合数据类型,数组属于引用数组类型
  • 如果两个数组有相同的引用,那么他们的元素相同