2.1 标识符与关键字
2.11 标识符
什么是标识符?
用来标识
类名
,变量名
,方法名
,类型名
,数组名
以及文件名的有效字符序列称为标识符。
简而言之 标识符就是一个名字
Java中标识符有以下限制
- 标识符由数字,字母,下划线,美元符号组成,长度不受限制
- 标识符第一个字符不能是数字
- 标识符不能是关键字
- 标识符不能是
ture false null
(尽管 true false null 不是Java关键字)
合法的标识符
HappyNewYear_ava
TigerYear_2010
$98apple
GWY_IS_PIG
hello
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
关键字来声明变量,声明时也可以给变量赋初始值
boolean male = true;
boolean isLight;
isLight = false;
2.2.2 整数类型
整型数据分为四种
int 4字节
使用关键字
int
来声明变量,也可以在声明时赋值
常量 123(十进制) 0b0110(二进制) 077(八进制) 0xFFFF(十六进制)
int x = 100;
int b = 077;
int c = 0xFF;
int d = 0b0110;
byte 1字节
使用关键字
byte
来声明变量,也可以在声明时赋值,Java中不存在byte类型常量表示方法,但是可以把一定范围内的int型常量赋值给byte
byte x=127;
short 2字节
使用关键字
short
来声明变量,也可以在声明时赋值
short x = 12;
long 8字节
使用关键字
long
来声明变量,也可以在声明时赋值,常量后缀用L
表示
long width =12,height =2005L;
2.2.3 字符类型 2字节
常量
A
a
?
!
の
你
等,即使用 单引号括起来的unicode
表中的字符。使用 关键字
char
来表示字符型变量
char ch = 'A';
char home ='家';
char $ = 'の';
Java中
int byte short long
没有unsigned
类型,因此unsigned int x = 10;
这种写法是错误的。但是 Java中 char 一定是
无符号
的,不允许使用unsigned
来修饰char 变量
2.2.4 浮点类型
浮点类型分为两种,单精度浮点型 float
和双精度浮点型 double
单精度浮点型
使用关键字
float
来表示单精度浮点型变量.需要注意的是单精度浮点型变量值后缀是以F
结尾的
float类型保留小数点后8位.
flaot PI = 3.14F;
双精度浮点型
使用关键字
double
来表示双精度浮点型变量,和float不同的是,不需要加F
后缀.
double类型保留小数点后16位
double PI = 3.14_15926_53589;
当值数字过长时,我们可用 _
分割来提高可读性。
2.3 类型转换运算
当把一种基本数据类型,变量赋值给另一种基本数据类型变量,是涉及到
数据转换
。
数据类型精度从低到高
当我们发生数据类型转换时,无非两种情况.
待转数据类型占用字节
>目标数据类型
待转数据类型占用字节
<目标数据类型
假设场景:我们要把一杯水从一个容器中,倒到另一个容器中(忽略物理条件,比如说杯壁残留)我们这里就是理想状态。
那么情况一: 从一个大容器中将水倒入一个小容器中。会发生什么?目标容器太小了,导致了
溢出
,如果我们继续倒水,那么就会有一部分水洒落,被丢失了
。再来看情况二:从一个小容器中将水倒入一个大容器中,显然这个可以倒下,并且不会溢出。
回到我们现实中,这里的 溢出
,用专业术来讲叫做 精度丢失
在Java中
- 低精度数据类型 -> 高精度数据类型
自动转
Java会自动帮助我们完成转换
// int -> float
float x = 100;
- 高精度数据类型-> 低精度数据类型
强制转
需要我们手动强制转换,会导致精度丢失.
// 强制类型转换语法
// 目标类型 变量名 = (目标类型) 源类型;
int x = (int)3.14;
long y =(long)56.98F;
int z =(int)1999L;
2.4 输入输出数据
2.4.1 输入基本型数据
Scanner
在Java中用来处理用户键盘输入的数据.
Scanner reader = new Scanner(System.in);
这里是Java创建对象的语句
Scanner reader
数据类型 变量名new Scanner()
调用Scanner 的构造方法
,new
关键字用来创建一个对象System.in
Java输入流对象
经过上述语句后,reader 就可以正式使用了
这里我们把 reader 叫做 实例化对象
调用下列方法,便可以读取用户在命令行输入的数据.
nextBoolean();
nextByte();
nextShort();
nextInt();
nextLong();
nextFloat();
nextDouble();
上述方法调用时会阻塞,程序等待用户输入完毕后继续执行.
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
System.out.println("你叫什么名字鸭?");
String name = reader.nextLine();
System.out.println("你好,"+name);
}
}
你叫什么名字鸭?
Jack
你好,Jack
我们调用方法需要使用
实例对象名.方法名()
这样才能正确调用。
2.4.2 输出基本类型
在Java中使用,
System.out.println()
或者System.out.println()
可输出串值
或者表达式值
。并允许使用+
将变量,表达式,或者一个常数值,字符,一起输出。
既然都是输出为什么还要有这两个语句呢?
- System.out.print()
打印不换行
- System.out.println()
打印后换行
这里的: println = print + line
public class HelloWorld {
public static void main(String[] args) {
System.out.println("我叫," + "Fangf");
System.out.println("我今年" + 22 + "岁了");
System.out.println("我怎么还没" + "女朋友"+'!');
}
}
我叫,Fangf
我今年22岁了
我怎么还没女朋友!
相信有学过C语言的读者们一定了解 printf
这个函数,他的作用是格式化打印输出.
Java中同样可以使用 System.out.printf()
public class HelloWorld {
public static void main(String[] args) {
System.out.printf("我叫%s,我今年%d岁了,我怎么还没女朋友%c","Fangf",22,'!');
}
}
我叫Fangf,我今年22岁了,我怎么还没女朋友!
这里的格式化控制符和C语言一模一样,不做详细概述.
- %d 输出
int 型
数据 - %c 输出
char型
数据 - %f 输出
浮点型
数据 ,小数部分最多保留6位- %.2f 保留两位小数
- %s 输出
字符串
数据 - %10s 右对齐10列
- %-5s 左对齐5列
2.5 数组
在前面我们学习了,
int char doule
等基本数据类型,现在有个问题如果我们要存取若干个连续类型相同的变量,我们应当如何做呢?
int x1,x2,x3,x4,x5;
这样?如果我要100w个数据,难道你写100w个变量吗?
所以上述方案是不可取的,我们需要引入数组的概念。
数组:一些类型相同元素组成的集合,在内存上是连续的。
数组是引用类型变量,不能像基本数据类型那样直接使用
2.5.1 声明数组
创建数组需要两个步骤
- 声明数组
- 分配元素
Java中声明数组有两种方式
元素类型 数组名[];
元素类型 [] 数组名称 // 推荐
这里推荐第二种方式,别问为什么,问就是好用!
有学过 C/C++的读者肯定要问了? 为什么不在 []
内写数组个数?
Java不允许在声明数组的方括号中,指定数组元素个数,否者将会导致语法错误.
2.5.2 为数组分配元素
声明数组仅仅是,给出了数组变量的名字和数据类型,想要真正使用数组还要给数组分配元素
数组名 = new 数组元素类型[元素个数];
例如
String [] girlFirends;
girlFriends = new String[3];
给数组指定元素
// 数组名[下标索引]=值
girlFriends[0]="null";
girlFriends[1]="none";
girlFriends[2]="nil";
声明数组和创建数组可以一起完成
float [] score = new int[5];
二维数组和一维数组一样,也需要在使用前进行初始化
int [][] points = new int[3][3];
和C语言不同的是Java允许使用int类型指定元素个数
int size = 5;
int [] arr = new int[size];
2.5.3 数组元素的使用
一维数组通过
索引
访问自己的元素,需要注意的是索引下标从0
开始,如果数组有个N个元素,那么索引最大可取值为N-1
。
public class HelloWorld {
public static void main(String[] args) {
String[] season = new String[4];
season[0] = "spring";
season[1] = "summer";
season[2] = "autumn";
season[3] = "winter";
// 访问数组元素
System.out.println(season[1]);
}
}
summer
如果数组下标超出范围,则会抛出 ArrayIndexOutOfBoundsException异常
public class HelloWorld {
public static void main(String[] args) {
String[] season = new String[4];
season[0] = "spring";
season[1] = "summer";
season[2] = "autumn";
season[3] = "winter";
// 访问数组元素
System.out.println(season[1]);
// 下标越界
System.out.println(season[4]);
}
}
summer
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4
at base.HelloWorld.main(HelloWorld.java:15)
2.5.4 length 的使用
数组名.length 可以查看数组长度
public class HelloWorld {
public static void main(String[] args) {
String[] season = new String[4];
season[0] = "spring";
season[1] = "summer";
season[2] = "autumn";
season[3] = "winter";
// 查看数组长度
System.out.println("size:"+season.length);
// 二维数组
int[][] ints = new int[3][5];
System.out.println("ints size:"+ints.length);
}
}
size:4
ints size:3
2.5.5 数组的初始化
创建数组后,系统会默认给数组元素一个初始值,我们在声明数组时,也可以给数组初始值.
double[] score = new double[]{98.0, 95.0, 93.0, 92.5};
相当于
double[] score;
score = new double[]{98.0, 95.0, 93.0, 92.5};
2.5.6 数组的引用
public class HelloWorld {
public static void main(String[] args) {
double[] score;
score = new double[]{98.0, 95.0, 93.0, 92.5};
// score 的引用
double[] temp = score;
System.out.println(score);
System.out.println(temp);
System.out.println(temp.length);
char city[] = new char[]{'山', '西', '省', '临', '汾', '市'};
System.out.println(city);
}
}
[D@60e53b93
[D@60e53b93
4
山西省临汾市
如果输出是 char[]
数据 则不会输出引用,而是输出数组的全部元素
本质上就是两个指针指向了同一块内存区域(需要注意的是Java中并没有指针的概念)
2.5.7 小结
- 标识符由数字,字母,下划线,美元符号组成,并且第一个字符不能是
数字
. - Java中有8种基本数据类型
boolean byte short int long float double char
- 数组是想同类型的数据元素按顺序组成的一种复合数据类型,数组属于
引用数组类型
- 如果两个数组有相同的引用,那么他们的元素相同